28 Commits

Author SHA1 Message Date
Dome e5c716740c Merge branch 'main' of https://github.com/Domoel/Zeitfresser-Wordpress-Theme 2026-04-26 04:06:20 +02:00
Dome 001390457b Sync 2026-04-26 04:06:01 +02:00
Dome f479530c4c Merge branch 'main' of https://github.com/Domoel/Zeitfresser-Wordpress-Theme 2026-04-26 03:57:36 +02:00
Dome e3302b79a3 Update functions.php 2026-04-26 03:57:22 +02:00
Dome 2a28d94b4d introduce 2026-04-26 03:56:28 +02:00
Dome fafc46e007 up version 2026-04-26 03:17:02 +02:00
Dome 9f92958651 refactor(core): introduce modular architecture and restructure theme into clean, maintainable components
This commit introduces a complete internal refactoring of the theme architecture,
transitioning from a monolithic functions.php structure to a modular, scalable system.

### Key Changes

#### 1. Modular Architecture
- Extracted core logic into dedicated modules under `/inc/`
- Introduced clear separation of concerns:
  - `helpers/` → shared utility functions
  - `performance/` → optimization and media processing logic
  - `customizer/` → fully modularized Customizer structure
  - `template-*` → presentation and template-related logic

#### 2. Customizer Refactor
- Replaced legacy monolithic customizer with modular system:
  - `core.php` → base setup
  - `general.php`, `layout.php`, `toc.php`, `social.php` → feature-based modules
- Improved maintainability and extensibility for future settings

#### 3. Performance Layer Separation
- Moved performance-related logic into `/inc/performance/`
- Clearly separated:
  - frontend performance tweaks (scripts, CSS, cleanup)
  - media optimization tools (batch processing, cleanup UI)
- Reduced coupling between UI, logic, and processing

#### 4. Media Optimization Pipeline Stabilization
- Re-aligned upload pipeline with WordPress native flow
- Restored proper use of `wp_generate_attachment_metadata`
- Ensured compatibility with:
  - format conversion (AVIF/WebP)
  - responsive image generation
  - WordPress core image handling

#### 5. Cleaner Hook Management
- Removed duplicated hooks and redundant filters
- Standardized hook priorities and responsibilities
- Ensured consistent use of feature toggles (`get_theme_mod`)

#### 6. Improved Code Quality
- Reduced function duplication
- Standardized naming conventions
- Improved readability and inline documentation
- Removed legacy patterns and implicit dependencies

#### 7. Asset Handling Improvements
- Introduced centralized asset versioning via `filemtime`
- Improved script loading strategy (defer non-critical JS)
- Cleaner enqueue structure for styles and scripts

#### 8. Foundation for Future Development
This refactor lays the groundwork for:
- easier feature expansion
- better testability
- improved debugging capabilities
- long-term maintainability

### Breaking Changes
- Internal file structure has changed significantly
- Direct modifications to old functions.php logic may no longer apply
- Customizer extensions must now hook into modular structure

---

This is a purely structural and architectural release.
No intentional changes to frontend behavior were introduced,
but the internal system is now significantly more robust and maintainable.
2026-04-26 03:16:00 +02:00
Dome 787cdb31aa up version 2026-04-25 15:09:49 +02:00
Dome 7b5bd18dcd fix(performance): correctly disable cleanup button when no actionable items remain
- Fix initial state where cleanup button stayed enabled after full cleanup
- Extend logic to detect "nothing to clean" cases:
  - no optimized images available for cleanup
  - all originals already deleted
- Align PHP initial render logic with runtime JS behavior
- Improve UX consistency between page load and live updates
2026-04-25 15:07:21 +02:00
Dome 937b36b27f up version 2026-04-25 10:22:58 +02:00
Dome 76902390e4 Merge branch 'main' of https://github.com/Domoel/Zeitfresser-Wordpress-Theme 2026-04-25 10:19:45 +02:00
Dome e1f7db91f8 fix(performance): delete all original image subsizes during cleanup
- Extend cleanup logic to remove full original image family (including subsizes)
- Fix issue where only the main original file was deleted
- Ensure consistent behavior for both manual batch processing and auto-delete
- Improve cleanup safety by validating optimization state before deletion
2026-04-25 10:19:33 +02:00
Dome 05c9a70e01 Update readme.md 2026-04-25 02:34:55 +02:00
Dome af8a9447b0 Update customizer.php 2026-04-25 02:26:19 +02:00
Dome b0eb1d9526 feat(performance): introduce image optimization pipeline with optional automation and cleanup
- Add AVIF/WebP conversion for uploads and legacy media
- Implement manual batch optimizer via Performance Tools dashboard
- Introduce automatic optimization toggle via Customizer
- Add optional automatic deletion of original images after optimization
- Ensure safe processing with versioned metadata and idempotent operations
- Decouple manual optimization from automation logic using force flag
- Add live progress UI for optimization and cleanup processes
- Improve UX with status indicators, dependency handling and warnings
2026-04-25 02:18:25 +02:00
Dome c6b0919eb3 Update readme.md 2026-04-23 23:32:07 +02:00
Dome 4f87ca1475 Update readme.md 2026-04-23 23:30:48 +02:00
Dome 271b7fef7f Update readme.md 2026-04-23 23:30:07 +02:00
Dome 32f17f6e9d Update readme.md 2026-04-23 23:29:14 +02:00
Dome a7c71933a8 cleanup fonts.css 2026-04-23 23:15:33 +02:00
Dome a3f69b4118 Update style.css 2026-04-23 21:14:47 +02:00
Dome 84ebfcadf2 Update fonts.css 2026-04-23 21:13:40 +02:00
Dome 5152784a20 feat(typography): migrate from Google Fonts to local font hosting
feat(typography): migrate from Google Fonts to local font hosting

Replaced external Google Fonts integration with locally hosted font files
for Oswald and Roboto.

- Added local @font-face definitions for Oswald (400, 500, 700)
- Added local @font-face definitions for Roboto (400, 500, 700)
- Removed Google Fonts enqueue and external requests
- Implemented unicode-range optimized font loading (latin subset)
- Fixed font file path inconsistencies causing fallback rendering
- Ensured correct font-weight mapping across all variants
- Maintained existing typography system via CSS variables

Result:
- No external font requests (fonts.googleapis.com / fonts.gstatic.com removed)
- Improved performance and privacy (GDPR compliant)
- Consistent rendering with original Google Fonts appearance
- Full control over font loading and optimization
2026-04-23 21:00:32 +02:00
Dome d066342413 Update style.css 2026-04-23 19:28:31 +02:00
Dome eaf31ba27e Update style.css 2026-04-23 18:52:29 +02:00
Dome 0d6ff33a68 functions.php fix 2026-04-23 18:45:30 +02:00
Dome d925911261 refactor(theme): remove dynamic styling systems and migrate to static CSS architecture
This commit introduces a major internal refactor of the theme, replacing all
dynamic styling mechanisms with a fully static, CSS-based system.

The previous implementation relied on WordPress Customizer settings, PHP-based
style generation, and inline CSS injection for fonts, colors, and header behavior.
These systems have been completely removed and replaced with a deterministic
architecture using CSS variables and dedicated stylesheets.

Key changes:
- Removed dynamic font system (Google/local/inline CSS)
- Removed dynamic color system and Customizer controls
- Removed legacy compatibility layer (legacy-aliases.php)
- Removed custom header support and related UI (header image, text color)
- Eliminated inline <style> injection in wp_head
- Introduced static typography system via fonts.css
- Introduced static color system via colors.css
- Refactored style.css to rely entirely on CSS variables
- Cleaned up conflicting font declarations and redundant rules
- Simplified theme structure and reduced PHP overhead
- Aligned translation template with theme slug (zeitfresser.pot)

Result:
- Improved frontend performance and caching behavior
- Reduced PHP execution and complexity
- Fully deterministic rendering without runtime style mutations
- Cleaner, more maintainable codebase

No visual changes intended.
2026-04-23 17:00:13 +02:00
Dome c06b2e25ba TOC optimizations 2026-04-22 10:47:30 +02:00
116 changed files with 2342 additions and 39047 deletions
+12
View File
@@ -0,0 +1,12 @@
:root {
--site-title-color: #f7f7fa;
--primary-color: #f7f7fa;
--secondary-color: #f7f7fa;
--light-color: #1e1f29;
--grey-color: #f7f7fa;
--dark-color: #f7f7fa;
}
body {
background-color: #1e1f29;
}
+121
View File
@@ -0,0 +1,121 @@
/* =========================
Local Fonts
========================= */
/* OSWALD */
@font-face {
font-family: 'Oswald';
src: url('../fonts/oswald-400.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Oswald';
src: url('../fonts/oswald-500.woff2') format('woff2');
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Oswald';
src: url('../fonts/oswald-700.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: swap;
}
/* ROBOTO */
@font-face {
font-family: 'Roboto';
src: url('../fonts/roboto-400.woff2') format('woff2');
font-weight: 400;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Roboto';
src: url('../fonts/roboto-500.woff2') format('woff2');
font-weight: 500;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Roboto';
src: url('../fonts/roboto-700.woff2') format('woff2');
font-weight: 700;
font-style: normal;
font-display: swap;
}
/* =========================
Typography System
========================= */
:root {
--primary-font: 'Oswald', var(--zeitfresser-heading-fallback);
--secondary-font: 'Roboto', var(--zeitfresser-body-fallback);
--site-identity-font-size: 40px;
--font-weight: 400;
--line-height: 1.6;
}
/* =========================
Base Typography
========================= */
body {
font-family: var(--secondary-font);
font-weight: var(--font-weight);
line-height: var(--line-height);
}
/* =========================
Headlines
========================= */
h1, h2, h3, h4, h5, h6,
.entry-title {
font-family: var(--primary-font);
font-weight: 500;
line-height: 1.3;
}
/* =========================
Site Title
========================= */
.site-title,
.site-title a {
font-family: var(--primary-font);
font-size: var(--site-identity-font-size);
font-weight: 700;
line-height: 1.2;
}
/* =========================
Content Typography
========================= */
.site-description,
.entry-content,
.post-content,
.inner-article-content {
font-family: var(--secondary-font);
}
html {
font-synthesis: none;
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

Before

Width:  |  Height:  |  Size: 264 B

After

Width:  |  Height:  |  Size: 264 B

+34 -12
View File
@@ -14,6 +14,8 @@ document.addEventListener('DOMContentLoaded', function () {
var headingOffset = 88;
var ticking = false;
var tocBottomOffset = null;
function isDesktop() {
return desktopQuery.matches;
}
@@ -34,6 +36,26 @@ document.addEventListener('DOMContentLoaded', function () {
});
}
function getArticleElement() {
return document.querySelector(
'.single-post .post-content article, ' +
'.single-post .post-content, ' +
'article.post, article, ' +
'.entry-content'
);
}
function getTocBottomOffset() {
if (tocBottomOffset !== null) return tocBottomOffset;
var value = getComputedStyle(document.documentElement)
.getPropertyValue('--toc-bottom-offset')
.trim();
tocBottomOffset = parseInt(value, 10) || 12;
return tocBottomOffset;
}
function syncPosition() {
if (!isDesktop()) {
document.documentElement.style.setProperty('--zeitfresser-toc-top', stickyTop + 'px');
@@ -84,25 +106,29 @@ document.addEventListener('DOMContentLoaded', function () {
return;
}
var footer = document.querySelector('footer.site-footer, footer, #colophon');
if (!footer) return;
var article = getArticleElement();
if (!article) {
toc.style.transform = '';
return;
}
toc.style.transform = '';
var scrollTop = window.scrollY || window.pageYOffset;
var footerTop = footer.getBoundingClientRect().top + scrollTop;
var articleRect = article.getBoundingClientRect();
var articleBottom = articleRect.top + scrollTop + articleRect.height;
var tocRect = toc.getBoundingClientRect();
var tocTop = tocRect.top + scrollTop;
var tocHeight = tocRect.height;
var tocBottom = tocTop + tocHeight;
var offset = 130;
var offset = getTocBottomOffset();
var maxBottom = footerTop - offset;
var overflow = tocBottom - maxBottom;
var maxBottom = articleBottom - offset;
var overflow = Math.ceil(tocBottom - maxBottom);
if (overflow > 0) {
toc.style.transform = 'translateY(-' + overflow + 'px)';
@@ -125,10 +151,7 @@ document.addEventListener('DOMContentLoaded', function () {
function updateProgress() {
if (!progressBar) return;
var article = document.querySelector(
'.single-post .post-content article, ' +
'.single-post .post-content, article.post, article'
);
var article = getArticleElement();
if (!article) {
progressBar.style.width = '0%';
@@ -144,7 +167,6 @@ document.addEventListener('DOMContentLoaded', function () {
function updateActiveHeading() {
var headings = getHeadings();
if (!headings.length) return;
var currentId = headings[0].target.id;
+4 -1
View File
@@ -5,7 +5,10 @@
* @package zeitfresser
*/
$copyright = get_theme_mod( 'footer_copyright_text', zeitfresser_get_default_footer_copyright() );
$copyright = get_theme_mod(
'footer_copyright_text',
'© ' . date('Y') . ' Zeitfresser'
);
?>
<footer id="colophon" class="site-footer">
+530 -342
View File
File diff suppressed because it is too large Load Diff
+51 -48
View File
@@ -2,13 +2,8 @@
/**
* The header for our theme
*
* This is the template that displays all of the <head> section and everything up until <div id="content">
*
* @link https://developer.wordpress.org/themes/basics/template-files/#template-partials
*
* @package zeitfresser
*/
?>
<!doctype html>
<html <?php language_attributes(); ?>>
@@ -22,60 +17,68 @@
</head>
<body <?php body_class(); ?>>
<?php wp_body_open(); ?>
<a class="skip-link screen-reader-text" href="#primary"><?php esc_html_e( 'Skip to content', 'zeitfresser' ); ?></a>
<?php wp_body_open(); ?>
<a class="skip-link screen-reader-text" href="#primary">
<?php esc_html_e( 'Skip to content', 'zeitfresser' ); ?>
</a>
<header id="masthead" class="site-header">
<header id="masthead" class="site-header">
<div class="header-wrapper">
<div class="container">
<div class="site-header-wrapper">
<div class="site-branding">
<div class="header-wrapper">
<div class="container">
<div class="site-header-wrapper">
<?php the_custom_logo(); ?>
<div class="site-branding">
<div class="site-identity">
<?php the_custom_logo(); ?>
<?php if( get_theme_mod( 'show_hide_site_title', zeitfresser_get_default_site_title_show_hide() ) ) { ?>
<div class="site-identity">
<?php if ( get_theme_mod( 'show_hide_site_title', true ) ) : ?>
<div class="site-title">
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home"
class="logo"><?php bloginfo( 'name' ); ?></a>
<a href="<?php echo esc_url( home_url( '/' ) ); ?>" rel="home" class="logo">
<?php bloginfo( 'name' ); ?>
</a>
</div>
<?php } ?>
<?php endif; ?>
<?php if ( get_theme_mod( 'show_hide_site_tagline', true ) ) : ?>
<div class="site-description">
<?php bloginfo( 'description' ); ?>
</div>
<?php endif; ?>
<?php $daisy_blog_description = get_bloginfo( 'description' ); ?>
<?php if( get_theme_mod( 'show_hide_site_tagline', zeitfresser_get_default_site_tagline_show_hide() ) ) { ?>
<div class="site-description"><?php echo $daisy_blog_description; ?></div>
<?php } ?>
</div>
</div><!-- .site-branding -->
<div class="nav-social-links">
<nav id="site-navigation" class="main-navigation">
<button id="nav-icon3" class="menu-toggle" aria-controls="primary-menu"
aria-expanded="false">
<span></span>
<span></span>
<span></span>
<span></span>
</button>
<?php
wp_nav_menu(
array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
)
);
?>
</nav><!-- #site-navigation -->
<?php get_template_part( 'template-parts/social', 'links' ); ?>
</div>
</div><!-- .site-branding -->
<div class="nav-social-links">
<nav id="site-navigation" class="main-navigation">
<button id="nav-icon3" class="menu-toggle" aria-controls="primary-menu" aria-expanded="false">
<span></span>
<span></span>
<span></span>
<span></span>
</button>
<?php
wp_nav_menu(
array(
'theme_location' => 'menu-1',
'menu_id' => 'primary-menu',
)
);
?>
</nav>
<?php get_template_part( 'template-parts/social', 'links' ); ?>
</div>
</div>
</div>
</header><!-- #masthead -->
</div>
</header><!-- #masthead -->
-23
View File
@@ -1,23 +0,0 @@
<?php
/**
* Register customizer blocks used by the Zeitfresser theme.
*/
if ( ! defined( 'ZEITFRESSER_BLOCKS_DIR_PATH' ) ) {
define( 'ZEITFRESSER_BLOCKS_DIR_PATH', dirname( __FILE__ ) );
}
if ( ! defined( 'DAISY_BLOG_BLOCKS_DIR_PATH' ) ) {
define( 'DAISY_BLOG_BLOCKS_DIR_PATH', ZEITFRESSER_BLOCKS_DIR_PATH );
}
require dirname( __FILE__ ) . '/includes/sanitize.php';
require dirname( __FILE__ ) . '/includes/register-controls.php';
require dirname( __FILE__ ) . '/site-identity/site-identity.php';
require dirname( __FILE__ ) . '/colors/colors.php';
require dirname( __FILE__ ) . '/font-family/font-family.php';
require dirname( __FILE__ ) . '/font-customization/font-customization.php';
require dirname( __FILE__ ) . '/general/general.php';
require dirname( __FILE__ ) . '/post-detail/post-detail.php';
require dirname( __FILE__ ) . '/footer-copyright/footer-copyright.php';
@@ -1,11 +0,0 @@
<?php
add_action( 'wp_enqueue_scripts', 'zeitfresser_sticky_menu_background_color' );
function zeitfresser_sticky_menu_background_color() {
$bg_color = get_theme_mod( 'background_color', get_theme_support( 'custom-background', 'default-color' ) );
$dynamic_css = "body,.site-header{background:#$bg_color;}";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_dark_color' );
function zeitfresser_dark_color( $wp_customize ) {
$wp_customize->add_setting( 'dark_color', array(
'default' => zeitfresser_get_default_dark_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color'
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'dark_color', array(
'label' => esc_html__( 'Misc Colors', 'zeitfresser' ),
'section' => 'colors',
'settings' => 'dark_color',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_dark_color_enqueue_scripts' );
function zeitfresser_dark_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-dark-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-dark/customizer-color-dark.js', array('jquery'), '', true );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('dark_color',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--dark-color', to);
}
);
} );
} );
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_grey_color' );
function zeitfresser_grey_color( $wp_customize ) {
$wp_customize->add_setting( 'grey_color', array(
'default' => zeitfresser_get_default_grey_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color'
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'grey_color', array(
'label' => esc_html__( 'Soft Text Color', 'zeitfresser' ),
'section' => 'colors',
'settings' => 'grey_color',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_grey_color_enqueue_scripts' );
function zeitfresser_grey_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-grey-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-grey/customizer-color-grey.js', array('jquery'), '', true );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('grey_color',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--grey-color', to);
}
);
} );
} );
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_light_color' );
function zeitfresser_light_color( $wp_customize ) {
$wp_customize->add_setting( 'light_color', array(
'default' => zeitfresser_get_default_light_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color'
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'light_color', array(
'label' => esc_html__( 'Header Color', 'zeitfresser' ),
'section' => 'colors',
'settings' => 'light_color',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_light_color_enqueue_scripts' );
function zeitfresser_light_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-light-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-light/customizer-color-light.js', array('jquery'), '', true );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('light_color',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--light-color', to);
}
);
} );
} );
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_primary_color' );
function zeitfresser_primary_color( $wp_customize ) {
$wp_customize->add_setting( 'primary_color', array(
'default' => zeitfresser_get_default_primary_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color'
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'primary_color', array(
'label' => esc_html__( 'Menu / Title / Button Color', 'zeitfresser' ),
'section' => 'colors',
'settings' => 'primary_color',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_primary_color_enqueue_scripts' );
function zeitfresser_primary_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-primary-color-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-primary/customizer-color-primary.js', array('jquery'), '', true );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('primary_color',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--primary-color', to);
}
);
} );
} );
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_secondary_color' );
function zeitfresser_secondary_color( $wp_customize ) {
$wp_customize->add_setting( 'secondary_color', array(
'default' => zeitfresser_get_default_secondary_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color'
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'secondary_color', array(
'label' => esc_html__( 'Highlight Color', 'zeitfresser' ),
'section' => 'colors',
'settings' => 'secondary_color',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_secondary_color_enqueue_scripts' );
function zeitfresser_secondary_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-secondary-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-secondary/customizer-color-secondary.js', array('jquery'), '', true );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('secondary_color',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--secondary-color', to);
}
);
} );
} );
@@ -1,25 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_site_title_color' );
function zeitfresser_site_title_color( $wp_customize ) {
$wp_customize->add_setting( 'site_title_color_option', array(
'default' => zeitfresser_get_default_site_title_color(),
'transport' => 'postMessage',
'sanitize_callback' => 'sanitize_hex_color',
) );
$wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, 'site_title_color_option', array(
'label' => esc_html__( 'Site Identity Color', 'zeitfresser' ),
'section' => 'title_tagline',
'settings' => 'site_title_color_option',
) ) );
}
add_action( 'customize_preview_init', 'zeitfresser_site_title_color_enqueue_scripts' );
function zeitfresser_site_title_color_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-site-title-color-customizer', get_template_directory_uri() . '/inc/blocks/colors/color-site-title/customizer-color-site-title.js', array(), '', true );
}
@@ -1,9 +0,0 @@
jQuery( function( $ ) {
wp.customize( 'site_title_color_option', function( value ) {
value.bind( function( to ) {
$( '.site-title a' ).css( 'color', to );
} );
} );
} );
-35
View File
@@ -1,35 +0,0 @@
<?php
add_action( 'after_setup_theme', function () {
add_theme_support( 'custom-header', array( 'header-text' => false ) );
} );
add_action('customize_register', 'zeitfresser_color_section');
function zeitfresser_color_section($wp_customize)
{
$wp_customize->get_section('colors')->title = esc_html__( "Color Options", 'zeitfresser' );
$wp_customize->get_section('colors')->priority = 21;
}
/* Add Default Colors for Customizer Settings */
require dirname( __FILE__ ) . '/default-colors.php';
if( db_fs()->is__premium_only() ) {
require dirname( __FILE__ ) . '/color-site-title/color-site-title.php';
require dirname( __FILE__ ) . '/color-primary/color-primary.php';
require dirname( __FILE__ ) . '/color-secondary/color-secondary.php';
require dirname( __FILE__ ) . '/color-light/color-light.php';
require dirname( __FILE__ ) . '/color-grey/color-grey.php';
require dirname( __FILE__ ) . '/color-dark/color-dark.php';
}
require dirname( __FILE__ ) . '/color-background/color-background.php';
require dirname( __FILE__ ) . '/dynamic-colors.php';
-37
View File
@@ -1,37 +0,0 @@
<?php
/* Default Site Title Color */
function zeitfresser_get_default_site_title_color() {
return "#f7f7fa";
}
/* Default Primary Color */
function zeitfresser_get_default_primary_color() {
return "#f7f7fa";
}
/* Default Secondary Color */
function zeitfresser_get_default_secondary_color() {
return "#f7f7fa";
}
/* Default Light Color */
function zeitfresser_get_default_light_color() {
return "#1e1f29";
}
/* Default Grey Color */
function zeitfresser_get_default_grey_color() {
return "#f7f7fa";
}
/* Default Dark Color */
function zeitfresser_get_default_dark_color() {
return "#f7f7fa";
}
/* Default Background Color */
function zeitfresser_get_default_background_color() {
return "1e1f29";
}
-62
View File
@@ -1,62 +0,0 @@
<?php
add_action( 'wp_enqueue_scripts', 'zeitfresser_site_title_color_dynamic_css' );
function zeitfresser_site_title_color_dynamic_css() {
$site_title_color = esc_attr( get_theme_mod( 'site_title_color_option', zeitfresser_get_default_site_title_color() ) );
$dynamic_css = ":root { --site-title-color: $site_title_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_secondary_color_dynamic_css' );
function zeitfresser_secondary_color_dynamic_css() {
$secondary_color = esc_attr( get_theme_mod( 'secondary_color', zeitfresser_get_default_secondary_color() ) );
$dynamic_css = ":root { --secondary-color: $secondary_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_primary_color_dynamic_css' );
function zeitfresser_primary_color_dynamic_css() {
$primary_color = esc_attr( get_theme_mod( 'primary_color', zeitfresser_get_default_primary_color() ) );
$dynamic_css = ":root { --primary-color: $primary_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_light_color_dynamic_css' );
function zeitfresser_light_color_dynamic_css() {
$light_color = esc_attr( get_theme_mod( 'light_color', zeitfresser_get_default_light_color() ) );
$dynamic_css = ":root { --light-color: $light_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_grey_color_dynamic_css' );
function zeitfresser_grey_color_dynamic_css() {
$grey_color = esc_attr( get_theme_mod( 'grey_color', zeitfresser_get_default_grey_color() ) );
$dynamic_css = ":root { --grey-color: $grey_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_dark_color_dynamic_css' );
function zeitfresser_dark_color_dynamic_css() {
$dark_color = esc_attr( get_theme_mod( 'dark_color', zeitfresser_get_default_dark_color() ) );
$dynamic_css = ":root { --dark-color: $dark_color; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,25 +0,0 @@
<?php
/* Default Font Size */
function zeitfresser_get_default_font_size() {
return 16;
}
function zeitfresser_get_default_logo_size() {
return 60;
}
function zeitfresser_get_default_site_identity_font_size() {
return 40;
}
function zeitfresser_get_default_font_weight() {
return "400";
}
function zeitfresser_get_default_line_height() {
return "1.6";
}
@@ -1,29 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_register_font_customization_section' );
function zeitfresser_register_font_customization_section( $wp_customize ) {
$wp_customize->add_section( 'daisy_blog_font_customization_section', array(
'title' => esc_html__( 'Font Options', 'zeitfresser' ),
'priority' => 20
) );
}
/* Add Default Font Customization for Customizer Settings */
require dirname( __FILE__ ) . '/default-font-customization.php';
require dirname( __FILE__ ) . '/logo-size/logo-size.php';
require dirname( __FILE__ ) . '/site-identity-font-size/site-identity-font-size.php';
require dirname( __FILE__ ) . '/font-size/font-size.php';
require dirname( __FILE__ ) . '/font-weight/font-weight.php';
require dirname( __FILE__ ) . '/line-height/line-height.php';
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('font_size',function ( value ) {
value.bind(function ( to ) {
$( 'body,html' ).css( 'font-size', to+'px' );
}
);
} );
} );
@@ -1,40 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_font_size' );
function zeitfresser_font_size( $wp_customize ) {
$wp_customize->add_setting( 'font_size', array(
'default' => zeitfresser_get_default_font_size(),
'transport' => 'postMessage',
'sanitize_callback' => 'absint'
) );
$wp_customize->add_control( 'font_size', array(
'type' => 'number',
'settings' => 'font_size',
'label' => esc_html__( 'Body Font Size', 'zeitfresser' ),
'section' => 'daisy_blog_font_customization_section',
'input_attrs' => array(
'min' => 1,
'max' => 30
)
) );
}
add_action( 'customize_preview_init', 'zeitfresser_font_size_enqueue_scripts' );
function zeitfresser_font_size_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-font-size-customizer', get_template_directory_uri() . '/inc/blocks/font-customization/font-size/customizer-font-size.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_font_size_dynamic_css' );
function zeitfresser_font_size_dynamic_css() {
$font_size = esc_attr( get_theme_mod( 'font_size', zeitfresser_get_default_font_size() ) );
$font_size .= 'px';
$dynamic_css = "html,body{font-size:{$font_size};}";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('font_weight',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--font-weight', to);
}
);
} );
} );
@@ -1,40 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_font_weight' );
function zeitfresser_font_weight( $wp_customize ) {
$wp_customize->add_setting( 'font_weight', array(
'default' => zeitfresser_get_default_font_weight(),
'transport' => 'postMessage',
'sanitize_callback' => 'absint'
) );
$wp_customize->add_control( 'font_weight', array(
'type' => 'number',
'settings' => 'font_weight',
'label' => esc_html__( 'Body Font Weight', 'zeitfresser' ),
'section' => 'daisy_blog_font_customization_section',
'input_attrs' => array(
'min' => 100,
'max' => 900,
'step' => 100
)
) );
}
add_action( 'customize_preview_init', 'zeitfresser_font_weight_enqueue_scripts' );
function zeitfresser_font_weight_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-font-weight-customizer', get_template_directory_uri() . '/inc/blocks/font-customization/font-weight/customizer-font-weight.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_font_weight_dynamic_css' );
function zeitfresser_font_weight_dynamic_css() {
$font_weight = esc_attr( get_theme_mod( 'font_weight', zeitfresser_get_default_font_weight() ) );
$dynamic_css = ":root { --font-weight: $font_weight; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('line_height',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--line-height', to);
}
);
} );
} );
@@ -1,40 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_line_height' );
function zeitfresser_line_height( $wp_customize ) {
$wp_customize->add_setting( 'line_height', array(
'default' => zeitfresser_get_default_line_height(),
'transport' => 'postMessage',
'sanitize_callback' => 'zeitfresser_sanitize_float'
) );
$wp_customize->add_control( 'line_height', array(
'type' => 'number',
'settings' => 'line_height',
'label' => esc_html__( 'Line Height', 'zeitfresser' ),
'section' => 'daisy_blog_font_customization_section',
'input_attrs' => array(
'min' => 1,
'max' => 5,
'step' => 0.1
)
) );
}
add_action( 'customize_preview_init', 'zeitfresser_line_height_enqueue_scripts' );
function zeitfresser_line_height_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-line-height-customizer', get_template_directory_uri() . '/inc/blocks/font-customization/line-height/customizer-line-height.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_line_height_dynamic_css' );
function zeitfresser_line_height_dynamic_css() {
$line_height = esc_attr( get_theme_mod( 'line_height', zeitfresser_get_default_line_height() ) );
$dynamic_css = ":root { --line-height: $line_height; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('logo_size',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--logo-size', to+'px');
}
);
} );
} );
@@ -1,41 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_logo_size' );
function zeitfresser_logo_size( $wp_customize ) {
$wp_customize->add_setting( 'logo_size', array(
'default' => zeitfresser_get_default_logo_size(),
'transport' => 'postMessage',
'sanitize_callback' => 'absint'
) );
$wp_customize->add_control( 'logo_size', array(
'type' => 'number',
'settings' => 'logo_size',
'priority' => 8,
'label' => esc_html__( 'Logo Size', 'zeitfresser' ),
'section' => 'title_tagline',
'input_attrs' => array(
'min' => 10,
'max' => 100
)
) );
}
add_action( 'customize_preview_init', 'zeitfresser_logo_size_enqueue_scripts' );
function zeitfresser_logo_size_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-logo-size-customizer', get_template_directory_uri() . '/inc/blocks/font-customization/logo-size/customizer-logo-size.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_logo_size_dynamic_css' );
function zeitfresser_logo_size_dynamic_css() {
$logo_size = esc_attr( get_theme_mod( 'logo_size', zeitfresser_get_default_logo_size() ) );
$logo_size .= 'px';
$dynamic_css = ":root { --logo-size: $logo_size; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('site_identity_font_size',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--site-identity-font-size', to+'px');
}
);
} );
} );
@@ -1,40 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_site_identity_font_size' );
function zeitfresser_site_identity_font_size( $wp_customize ) {
$wp_customize->add_setting( 'site_identity_font_size', array(
'default' => zeitfresser_get_default_site_identity_font_size(),
'transport' => 'postMessage',
'sanitize_callback' => 'absint'
) );
$wp_customize->add_control( 'site_identity_font_size', array(
'type' => 'number',
'settings' => 'site_identity_font_size',
'label' => esc_html__( 'Site Identity Size', 'zeitfresser' ),
'section' => 'title_tagline',
'input_attrs' => array(
'min' => 10,
'max' => 40
)
) );
}
add_action( 'customize_preview_init', 'zeitfresser_site_identity_font_size_enqueue_scripts' );
function zeitfresser_site_identity_font_size_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-site-identity-font-size-customizer', get_template_directory_uri() . '/inc/blocks/font-customization/site-identity-font-size/customizer-site-identity-font-size.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_site_identity_font_size_dynamic_css' );
function zeitfresser_site_identity_font_size_dynamic_css() {
$site_identity_font_size = esc_attr( get_theme_mod( 'site_identity_font_size', zeitfresser_get_default_site_identity_font_size() ) );
$site_identity_font_size .= 'px';
$dynamic_css = ":root { --site-identity-font-size: $site_identity_font_size; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,14 +0,0 @@
<?php
/* Default Font Family */
function zeitfresser_get_default_site_identity_font_family() {
return esc_html__( "Oswald", 'zeitfresser' );
}
function zeitfresser_get_default_main_font_family() {
return esc_html__( "Oswald", 'zeitfresser' );
}
function zeitfresser_get_default_secondary_font_family() {
return esc_html__( "Roboto", 'zeitfresser' );
}
-40
View File
@@ -1,40 +0,0 @@
<?php
/* Add Google Fonts */
require dirname( __FILE__ ) . '/google-fonts.php';
/* Add Default Font Family for Customizer Settings */
require dirname( __FILE__ ) . '/default-font-family.php';
include_once wp_normalize_path( dirname( __FILE__ ) . '/inc/helper-functions.php' );
include_once wp_normalize_path( dirname( __FILE__ ) . '/inc/class-webfonts-local.php' );
include_once wp_normalize_path( dirname( __FILE__ ) . '/inc/class-fonts-google-local.php' );
require dirname( __FILE__ ) . '/site-identity/site-identity-font-family.php';
require dirname( __FILE__ ) . '/main/main-font-family.php';
require dirname( __FILE__ ) . '/secondary/secondary-font-family.php';
add_action( 'wp_enqueue_scripts', 'zeitfresser_google_fonts_scripts', 5 );
function zeitfresser_google_fonts_scripts() {
$local_css = zeitfresser_get_local_webfonts_css();
wp_register_style( 'zeitfresser-webfonts', false, array(), ZEITFRESSER_VERSION );
wp_enqueue_style( 'zeitfresser-webfonts' );
if ( ! empty( $local_css ) ) {
wp_add_inline_style( 'zeitfresser-webfonts', $local_css );
return;
}
$args = zeitfresser_used_google_fonts();
$fonts_url = zeitfresser_fonts_url( $args );
if ( empty( $fonts_url ) ) {
return;
}
wp_enqueue_style( 'google-fonts', $fonts_url, array(), null );
}
File diff suppressed because it is too large Load Diff
@@ -1,457 +0,0 @@
<?php
/**
* Handles downloading a font from the google-fonts API locally.
* Solves privacy concerns with Google's CDN
* and their sometimes less-than-transparent policies.
*
* @package zeitfresser
*/
// Do not allow directly accessing this file.
if ( ! defined( 'ABSPATH' ) ) {
exit( 'Direct script access denied.' );
}
final class Daisy_Blog_Google_Local {
/**
* The name of the font-family
*
* @access private
* @var string
*/
private $family;
/**
* The system path where font-files are stored.
*
* @access private
* @var string
*/
private $folder_path;
/**
* The URL where files for this font can be found.
*
* @access private
* @var string
*/
private $folder_url;
/**
* An array of instances for this object.
*
* @static
* @access private
* @var array
*/
private static $instances = array();
/**
* Create an instance of this object for a specific font-family.
*
* @static
* @access public
* @param string $family The font-family name.
* @return Daisy_Blog_Google_Local
*/
public static function init( $family ) {
$key = sanitize_key( $family );
if ( ! isset( self::$instances[ $key ] ) ) {
self::$instances[ $key ] = new self( $family );
}
return self::$instances[ $key ];
}
/**
* Constructor.
*
* @access private
* @param string $family The font-family name.
*/
private function __construct( $family ) {
$this->family = $family;
$key = sanitize_key( $this->family );
$this->folder_path = $this->get_root_path() . "/$key";
$this->folder_url = $this->get_root_url() . "/$key";
$this->files = $this->get_font_family();
}
/**
* Gets the @font-face CSS.
*
* @access public
* @param array $variants The variants we want to get.
* @return string
*/
public function get_css( $variants = array() ) {
if ( ! $this->files ) {
return;
}
$key = md5( wp_json_encode( $this->files ) );
$cached = get_transient( $key );
if ( $cached ) {
return $cached;
}
$css = '';
// If $variants is empty then use all variants available.
if ( empty( $variants ) ) {
$variants = array_keys( $this->files );
}
// Download files.
$this->download_font_family( $variants );
// Create the @font-face CSS.
foreach ( $variants as $variant ) {
$css .= $this->get_variant_fontface_css( $variant );
}
set_transient( $key, $css, WEEK_IN_SECONDS );
return $css;
}
/**
* Download font-family files.
*
* @access public
* @param array $variants An array of variants to download. Leave empty to download all.
* @return void
*/
public function download_font_family( $variants = array() ) {
if ( empty( $variants ) ) {
$variants = array_keys( $this->files );
}
foreach ( $this->files as $variant => $file ) {
if ( in_array( $variant, $variants ) ) { // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict
$this->download_font_file( $file );
}
}
}
/**
* Downloads a font-file and saves it locally.
*
* @access private
* @param string $url The URL of the file we want to get.
* @return bool
*/
private function download_font_file( $url ) {
$path = $this->folder_path . '/' . $this->get_filename_from_url( $url );
// If the folder doesn't exist, create it.
if ( ! file_exists( $this->folder_path ) ) {
wp_mkdir_p( $this->folder_path );
}
// If the file exists no reason to do anything.
if ( file_exists( $path ) ) {
return true;
}else{
$contents = $this->get_remote_url_contents( $url );
// Write file.
$filesystem = $this->get_filesystem();
return $filesystem->put_contents( $path, $contents, FS_CHMOD_FILE );
}
}
/**
* Gets the remote URL contents.
*
* @access private
* @param string $url The URL we want to get.
* @return string The contents of the remote URL.
*/
public function get_remote_url_contents( $url ) {
$response = wp_remote_get( $url );
if ( is_wp_error( $response ) ) {
return array();
}
$html = wp_remote_retrieve_body( $response );
if ( is_wp_error( $html ) ) {
return;
}
return $html;
}
/**
* Gets the filename by breaking-down the URL parts.
*
* @access private
* @param string $url The URL.
* @return string The filename.
*/
private function get_filename_from_url( $url ) {
$url_parts = explode( '/', $url );
$parts_count = count( $url_parts );
if ( 1 < $parts_count ) {
return $url_parts[ count( $url_parts ) - 1 ];
}
return $url;
}
/**
* Get the @font-face CSS for a specific variant.
*
* @access public
* @param string $variant The variant.
* @return string
*/
public function get_variant_fontface_css( $variant ) {
$font_face = "@font-face{font-family:'{$this->family}';";
// Get the font-style.
$font_style = ( false !== strpos( $variant, 'italic' ) ) ? 'italic' : 'normal';
$font_face .= "font-style:{$font_style};";
// Get the font-weight.
$font_weight = '400';
$font_weight = str_replace( 'italic', '', $variant );
$font_weight = ( ! $font_weight || 'regular' === $font_weight ) ? '400' : $font_weight;
$font_face .= "font-weight:{$font_weight};";
// Get the font-names.
$font_name_0 = $this->get_local_font_name( $variant, false );
$font_name_1 = $this->get_local_font_name( $variant, true );
$font_face .= "src:local('{$font_name_0}'),";
if ( $font_name_0 !== $font_name_1 ) {
$font_face .= "local('{$font_name_1}'),";
}
// Get the font-url.
$font_url = $this->get_variant_local_url( $variant );
$paths = $this->get_font_files_paths();
if ( ! file_exists( $paths[ $variant ] ) ) {
$font_url = $this->files[ $variant ];
}
// Get the font-format.
$font_format = ( strpos( $font_url, '.woff2' ) ) ? 'woff2' : 'truetype';
$font_format = ( strpos( $font_url, '.woff' ) && ! strpos( $font_url, '.woff2' ) ) ? 'woff' : $font_format;
$font_face .= "url({$font_url}) format('{$font_format}');}";
return $font_face;
}
/**
* Get the name of the font-family.
* This is used by @font-face in case the user already has the font downloaded locally.
*
* @access public
* @param string $variant The variant.
* @param bool $compact Whether we want the compact formatting or not.
* @return string
*/
public function get_local_font_name( $variant, $compact = false ) {
$variant_names = array(
'100' => 'Thin',
'100i' => 'Thin Italic',
'100italic' => 'Thin Italic',
'200' => 'Extra-Light',
'200i' => 'Extra-Light Italic',
'200italic' => 'Extra-Light Italic',
'300' => 'Light',
'300i' => 'Light Italic',
'300italic' => 'Light Italic',
'400' => 'Regular',
'regular' => 'Regular',
'400i' => 'Regular Italic',
'italic' => 'Italic',
'400italic' => 'Regular Italic',
'500' => 'Medium',
'500i' => 'Medium Italic',
'500italic' => 'Medium Italic',
'600' => 'Semi-Bold',
'600i' => 'Semi-Bold Italic',
'600italic' => 'Semi-Bold Italic',
'700' => 'Bold',
'700i' => 'Bold Italic',
'700italic' => 'Bold Italic',
'800' => 'Extra-Bold',
'800i' => 'Extra-Bold Italic',
'800italic' => 'Extra-Bold Italic',
'900' => 'Black',
'900i' => 'Black Italic',
'900italic' => 'Black Italic',
);
$variant = (string) $variant;
if ( $compact ) {
if ( isset( $variant_names[ $variant ] ) ) {
return str_replace( array( ' ', '-' ), '', $this->family ) . '-' . str_replace( array( ' ', '-' ), '', $variant_names[ $variant ] );
}
return str_replace( array( ' ', '-' ), '', $this->family );
}
if ( isset( $variant_names[ $variant ] ) ) {
return $this->family . ' ' . $variant_names[ $variant ];
}
return $this->family;
}
/**
* Gets the local URL for a variant.
*
* @access public
* @param string $variant The variant.
* @return string The URL.
*/
public function get_variant_local_url( $variant ) {
$local_urls = $this->get_font_files_urls_local();
if ( empty( $local_urls ) ) {
return;
}
// Return the specific variant if we can find it.
if ( isset( $local_urls[ $variant ] ) ) {
return $local_urls[ $variant ];
}
// Return regular if the one we want could not be found.
if ( isset( $local_urls['regular'] ) ) {
return $local_urls['regular'];
}
// Return the first available if all else failed.
$vals = array_values( $local_urls );
return $vals[0];
}
/**
* Get an array of local file URLs.
*
* @access public
* @return array
*/
public function get_font_files_urls_local() {
$urls = array();
$files = $this->get_font_files();
foreach ( $files as $key => $file ) {
$urls[ $key ] = $this->folder_url . '/' . $file;
}
return $urls;
}
/**
* Get an array of local file paths.
*
* @access public
* @return array
*/
public function get_font_files_paths() {
$paths = array();
$files = $this->get_font_files();
foreach ( $files as $key => $file ) {
$paths[ $key ] = $this->folder_path . '/' . $file;
}
return $paths;
}
/**
* Get an array of font-files.
* Only contains the filenames.
*
* @access public
* @return array
*/
public function get_font_files() {
$files = array();
foreach ( $this->files as $key => $url ) {
$files[ $key ] = $this->get_filename_from_url( $url );
}
return $files;
}
/**
* Gets the root fonts folder path.
* Other paths are built based on this.
*
* @access public
* @return string
*/
public function get_root_path() {
// Get the upload directory for this site.
$upload_dir = wp_upload_dir();
$path = untrailingslashit( wp_normalize_path( $upload_dir['basedir'] ) ) . '/webfonts';
// If the folder doesn't exist, create it.
if ( ! file_exists( $path ) ) {
wp_mkdir_p( $path );
}
// Return the path.
return apply_filters( 'daisy_blog_googlefonts_root_path', $path );
}
/**
* Gets the root folder url.
* Other urls are built based on this.
*
* @access public
* @return string
*/
public function get_root_url() {
// Get the upload directory for this site.
$upload_dir = wp_upload_dir();
// The URL.
$url = trailingslashit( $upload_dir['baseurl'] );
// Take care of domain mapping.
// When using domain mapping we have to make sure that the URL to the file
// does not include the original domain but instead the mapped domain.
if ( defined( 'DOMAIN_MAPPING' ) && DOMAIN_MAPPING ) {
if ( function_exists( 'domain_mapping_siteurl' ) && function_exists( 'get_original_url' ) ) {
$mapped_domain = domain_mapping_siteurl( false );
$original_domain = get_original_url( 'siteurl' );
$url = str_replace( $original_domain, $mapped_domain, $url );
}
}
$url = str_replace( array( 'https://', 'http://' ), '//', $url );
return apply_filters( 'daisy_blog_googlefonts_root_url', untrailingslashit( esc_url_raw( $url ) ) . '/webfonts' );
}
/**
* Get a font-family from the array of google-fonts.
*
* @access public
* @return array
*/
public function get_font_family() {
// Get the fonts array.
$fonts = $this->get_fonts();
if ( isset( $fonts[ $this->family ] ) ) {
return $fonts[ $this->family ];
}
return array();
}
/**
* Get the font defined in the google-fonts API.
*
* @access private
* @return array
*/
private function get_fonts() {
zeitfresser_get_google_fonts();
}
/**
* Gets the WP_Filesystem object.
*
* @access protected
* @return object
*/
protected function get_filesystem(){
// The WordPress filesystem.
global $wp_filesystem;
if ( empty( $wp_filesystem ) ) {
require_once wp_normalize_path( ABSPATH . '/wp-admin/includes/file.php' );
WP_Filesystem();
}
return $wp_filesystem;
}
}
@@ -1,60 +0,0 @@
<?php
/**
* Handles adding to the footer the @font-face CSS for locally-hosted google-fonts.
* Solves privacy concerns with Google's CDN and their sometimes less-than-transparent policies.
*
* @package zeitfresser
*/
/**
* Manages the way Google Fonts are enqueued.
*/
final class Daisy_Blog_Webfonts_Local{
/**
* @access protected
*/
protected $googlefonts;
/**
* Constructor.
*
* @access public
*/
public function __construct( $googlefonts ) {
$this->googlefonts = $googlefonts;
add_action( 'wp_footer', array( $this, 'add_styles' ) );
add_action( 'admin_footer', array( $this, 'add_styles' ) );
}
/**
* Webfont Loader for Google Fonts.
*
* @access public
*/
public function add_styles() {
$hosted_fonts = $this->googlefonts;
// Early exit if we don't need to add any fonts.
if ( empty( $hosted_fonts ) ) {
return;
}
// Make sure we only do this once per font-family.
$hosted_fonts = array_unique( $hosted_fonts );
// Start CSS.
$css = '';
foreach( $hosted_fonts as $family ){
// Add the @font-face CSS for this font-family.
$css .= Daisy_Blog_Google_Local::init( $family )->get_css();
}
// If we've got CSS, add to the footer.
if ( $css ) {
echo '<style id="daisy-blog-local-webfonts">' . $css . '</style>'; // WPCS: XSS ok.
}
}
}
File diff suppressed because it is too large Load Diff
@@ -1,334 +0,0 @@
<?php
/**
* Function to check if it's a google font
*/
function zeitfresser_is_google_font( $font ){
$return = false;
$websafe_fonts = zeitfresser_get_websafe_font();
if( $font ){
if( array_key_exists( $font, $websafe_fonts ) ){
//Web Safe Font
$return = false;
}else{
//Google Font
$return = true;
}
}
return $return;
}
if( ! function_exists( 'zeitfresser_get_websafe_font' ) ) {
/**
* Function listing WebSafe Fonts and its attributes
*/
function zeitfresser_get_websafe_font(){
$standard_fonts = array(
'georgia-serif' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => 'Georgia, serif',
),
'palatino-serif' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Palatino Linotype", "Book Antiqua", Palatino, serif',
),
'times-serif' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Times New Roman", Times, serif',
),
'arial-helvetica' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => 'Arial, Helvetica, sans-serif',
),
'arial-gadget' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Arial Black", Gadget, sans-serif',
),
'comic-cursive' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Comic Sans MS", cursive, sans-serif',
),
'impact-charcoal' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => 'Impact, Charcoal, sans-serif',
),
'lucida' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Lucida Sans Unicode", "Lucida Grande", sans-serif',
),
'tahoma-geneva' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => 'Tahoma, Geneva, sans-serif',
),
'trebuchet-helvetica' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Trebuchet MS", Helvetica, sans-serif',
),
'verdana-geneva' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => 'Verdana, Geneva, sans-serif',
),
'courier' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Courier New", Courier, monospace',
),
'lucida-monaco' => array(
'variants' => array( 'regular', 'italic', '700', '700italic' ),
'fonts' => '"Lucida Console", Monaco, monospace',
)
);
return apply_filters( 'daisy_blog_standard_fonts', $standard_fonts );
}
}
function zeitfresser_used_google_fonts() {
$main_font_family = zeitfresser_get_mod( 'main_font_family', zeitfresser_get_default_main_font_family() );
$secondary_font_family = zeitfresser_get_mod( 'secondary_font_family', zeitfresser_get_default_secondary_font_family() );
$site_identity_font_family = esc_attr( zeitfresser_get_mod( 'site_identity_font_family', zeitfresser_get_default_site_identity_font_family() ) );
$args['main_font_family'] = $main_font_family;
$args['secondary_font_family'] = $secondary_font_family;
$args['site_identity_font_family'] = $site_identity_font_family;
return $args;
}
add_action( 'wp_loaded', 'zeitfresser_google_font_local' );
if( ! function_exists( 'zeitfresser_google_font_local' ) ) {
/**
* Function that load Google Fonts used in our theme from customer locally.
* Solves privacy concerns with Google's CDN and their sometimes less-than-transparent policies.
*/
function zeitfresser_google_font_local() {
$args = array();
$fonts = zeitfresser_used_google_fonts();
foreach( $fonts as $font ) {
$is_google_font = zeitfresser_is_google_font( $font );
if( $is_google_font ) {
array_push( $args, $font );
}
}
new Daisy_Blog_Webfonts_Local( $args );
}
}
if ( ! function_exists( 'zeitfresser_font_weight_variants' ) ) {
/**
* Return the font variants used by the theme as an array.
*
* @return array
*/
function zeitfresser_font_weight_variants() {
$weights = explode( ';', zeitfresser_font_weight_query() );
$weights = array_map( 'trim', $weights );
$weights = array_filter( $weights );
if ( ! in_array( '400', $weights, true ) ) {
$weights[] = '400';
}
$weights = array_values( array_unique( $weights ) );
sort( $weights );
return $weights;
}
}
if ( ! function_exists( 'zeitfresser_get_local_webfonts_css' ) ) {
/**
* Build local @font-face CSS for currently selected Google fonts.
*
* Falls back to remote font file URLs per variant if a local file is not
* available yet, so typography does not break during warmup.
*
* @return string
*/
function zeitfresser_get_local_webfonts_css() {
$fonts = array_values( array_unique( array_filter( zeitfresser_used_google_fonts() ) ) );
$variants = zeitfresser_font_weight_variants();
$css = '';
foreach ( $fonts as $font ) {
if ( ! zeitfresser_is_google_font( $font ) ) {
continue;
}
$css .= Daisy_Blog_Google_Local::init( $font )->get_css( $variants );
}
return $css;
}
}
if ( ! function_exists( 'zeitfresser_get_local_webfont_urls' ) ) {
/**
* Extract local font asset URLs from a generated @font-face stylesheet.
*
* @param string $css Local webfont CSS.
* @return array
*/
function zeitfresser_get_local_webfont_urls( $css ) {
if ( empty( $css ) ) {
return array();
}
preg_match_all( '#url\(([^)]+)\)#', $css, $matches );
if ( empty( $matches[1] ) ) {
return array();
}
$urls = array();
foreach ( $matches[1] as $url ) {
$url = trim( $url, "\"'" );
if ( false !== strpos( $url, content_url() ) ) {
$urls[] = esc_url_raw( $url );
}
}
return array_values( array_unique( array_filter( $urls ) ) );
}
}
if( ! function_exists( 'zeitfresser_font_weight_query' ) ) {
/**
* Return the compact weight list used by the Zeitfresser theme.
*/
function zeitfresser_font_weight_query() {
$weights = array( '400', '500', '700' );
$body_weight = (string) zeitfresser_get_mod( 'font_weight', zeitfresser_get_default_font_weight() );
if ( preg_match( '/^\d{3}$/', $body_weight ) ) {
$weights[] = $body_weight;
}
$weights = array_values( array_unique( array_filter( $weights ) ) );
sort( $weights );
return implode( ';', $weights );
}
}
if( ! function_exists( 'zeitfresser_fonts_url' ) ) {
/**
* Returns a Google Fonts CSS2 URL for the selected theme fonts.
*/
function zeitfresser_fonts_url( $fonts = array() ) {
$font_families = array();
$weights = zeitfresser_font_weight_query();
foreach ( $fonts as $font ) {
if ( ! zeitfresser_is_google_font( $font ) ) {
continue;
}
$family_name = trim( (string) $font );
if ( '' === $family_name ) {
continue;
}
$font_families[] = 'family=' . str_replace( ' ', '+', $family_name ) . ':wght@' . $weights;
}
$font_families = array_values( array_unique( $font_families ) );
if ( empty( $font_families ) ) {
return '';
}
return esc_url( 'https://fonts.googleapis.com/css2?' . implode( '&', $font_families ) . '&display=swap' );
}
}
if( ! function_exists( 'zeitfresser_check_varient' ) ) {
/**
* Checks for matched varients in google fonts for typography fields
*/
function zeitfresser_check_varient( $font_family = 'serif', $font_variants = 'regular', $body = false ){
$variant = '';
$var = array();
$google_fonts = zeitfresser_get_google_fonts(); //Google Fonts
$websafe_fonts = zeitfresser_get_websafe_font(); //Standard Web Safe Fonts
if( array_key_exists( $font_family, $google_fonts ) ){
$variants = $google_fonts[ $font_family ][ 'variants' ];
if( in_array( $font_variants, $variants ) ){
if( $body ){ //LOAD ALL VARIANTS FOR BODY FONT
foreach( $variants as $v ){
$var[] = $v;
}
$variant = implode( ',', $var );
}else{
$variant = $font_variants;
}
}else{
$variant = 'regular';
}
}else{ //Standard Web Safe Fonts
if( array_key_exists( $font_family, $websafe_fonts ) ){
$variants = $websafe_fonts[ $font_family ][ 'variants' ];
if( in_array( $font_variants, $variants ) ){
if( $body ){ //LOAD ALL VARIANTS FOR BODY FONT
foreach( $variants as $v ){
$var[] = $v;
}
$variant = implode( ',', $var );
}else{
$variant = $font_variants;
}
}else{
$variant = 'regular';
}
}
}
return $variant;
}
}
if( ! function_exists( 'zeitfresser_get_google_fonts' ) ) {
/**
* Get Google Fonts
*/
function zeitfresser_get_google_fonts(){
$webfonts_json = @file_get_contents( get_template_directory_uri() . '/inc/blocks/font-family/inc/google-webfonts.json', true );
$fonts = json_decode( $webfonts_json, true );
$google_fonts = array();
if ( is_array( $fonts ) ) {
foreach ( $fonts['items'] as $font ) {
$google_fonts[ $font['family'] ] = array(
'variants' => $font['variants'],
);
}
}
return $google_fonts;
}
}
@@ -1,11 +0,0 @@
jQuery( function( $ ) {
wp.customize('main_font_family',function ( value ) {
value.bind(function ( to ) {
$("head").append("<link href='https://fonts.googleapis.com/css?family=" + to + ":200,300,400,500,600,700,800,900|' rel='stylesheet' type='text/css'>");
document.body.style.setProperty('--primary-font', to);
}
);
} );
} );
@@ -1,40 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_main_font_family' );
function zeitfresser_main_font_family( $wp_customize ) {
$wp_customize->add_setting( 'main_font_family', array(
'default' => zeitfresser_get_default_main_font_family(),
'transport' => 'postMessage',
'sanitize_callback' => 'zeitfresser_sanitize_google_fonts'
) );
$wp_customize->add_control( 'main_font_family', array(
'settings' => 'main_font_family',
'label' => esc_html__( 'Primary Font', 'zeitfresser' ),
'section' => 'daisy_blog_font_customization_section',
'type' => 'select',
'choices' => zeitfresser_google_fonts( zeitfresser_free_pro() ),
) );
}
add_action( 'customize_preview_init', 'zeitfresser_main_font_family_enqueue_scripts' );
function zeitfresser_main_font_family_enqueue_scripts() {
$main_font_family = esc_attr( get_theme_mod( 'main_font_family', zeitfresser_get_default_main_font_family() ) );
wp_enqueue_script( 'graphthemes-main-font-family-customizer', get_template_directory_uri() . '/inc/blocks/font-family/main/customizer-main-font-family.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_main_font_family_dynamic_css' );
function zeitfresser_main_font_family_dynamic_css() {
$main_font_family = esc_attr( get_theme_mod( 'main_font_family', zeitfresser_get_default_main_font_family() ) );
$dynamic_css = ":root { --primary-font: $main_font_family; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,11 +0,0 @@
jQuery( function( $ ) {
wp.customize('secondary_font_family',function ( value ) {
value.bind(function ( to ) {
$("head").append("<link href='https://fonts.googleapis.com/css?family=" + to + ":200,300,400,500,600,700,800,900|' rel='stylesheet' type='text/css'>");
document.body.style.setProperty('--secondary-font', to);
}
);
} );
} );
@@ -1,42 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_secondary_font_family' );
function zeitfresser_secondary_font_family( $wp_customize ) {
$wp_customize->add_setting( 'secondary_font_family', array(
'default' => zeitfresser_get_default_secondary_font_family(),
'transport' => 'postMessage',
'sanitize_callback' => 'zeitfresser_sanitize_google_fonts'
) );
$wp_customize->add_control( 'secondary_font_family', array(
'settings' => 'secondary_font_family',
'label' => esc_html__( 'Secondary Font', 'zeitfresser' ),
'section' => 'daisy_blog_font_customization_section',
'type' => 'select',
'choices' => zeitfresser_google_fonts( zeitfresser_free_pro() ),
) );
}
add_action( 'customize_preview_init', 'zeitfresser_secondary_font_family_enqueue_scripts' );
function zeitfresser_secondary_font_family_enqueue_scripts() {
$secondary_font_family = esc_attr( get_theme_mod( 'secondary_font_family', zeitfresser_get_default_secondary_font_family() ) );
wp_enqueue_script( 'graphthemes-secondary-font-family-customizer', get_template_directory_uri() . '/inc/blocks/font-family/secondary/customizer-secondary-font-family.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_secondary_font_family_dynamic_css' );
function zeitfresser_secondary_font_family_dynamic_css() {
$secondary_font_family = esc_attr( get_theme_mod( 'secondary_font_family', zeitfresser_get_default_secondary_font_family() ) );
$dynamic_css = ":root { --secondary-font: $secondary_font_family; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,11 +0,0 @@
jQuery( function( $ ) {
wp.customize('site_identity_font_family',function ( value ) {
value.bind(function ( to ) {
$("head").append("<link rel='stylesheet' href='https://fonts.googleapis.com/css?family="+to+":200,300,400,500,600,700,800,900|' rel='stylesheet' type='text/css'>");
document.body.style.setProperty('--site-identity-font-family', to);
}
);
} );
} );
@@ -1,41 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_site_identity_font_family' );
function zeitfresser_site_identity_font_family( $wp_customize ) {
$wp_customize->add_setting( 'site_identity_font_family', array(
'default' => zeitfresser_get_default_site_identity_font_family(),
'transport' => 'postMessage',
'sanitize_callback' => 'zeitfresser_sanitize_google_fonts'
) );
$wp_customize->add_control( 'site_identity_font_family', array(
'settings' => 'site_identity_font_family',
'label' => esc_html__( 'Site Title/Tagline Font', 'zeitfresser' ),
'section' => 'title_tagline',
'type' => 'select',
'choices' => zeitfresser_google_fonts( zeitfresser_free_pro() ),
) );
}
add_action( 'customize_preview_init', 'zeitfresser_site_identity_font_family_enqueue_scripts' );
function zeitfresser_site_identity_font_family_enqueue_scripts() {
$site_identity_font_family = esc_attr( get_theme_mod( 'site_identity_font_family', zeitfresser_get_default_site_identity_font_family() ) );
wp_enqueue_script( 'graphthemes-site-identity-font-family-customizer', get_template_directory_uri() . '/inc/blocks/font-family/site-identity/customizer-site-identity-font-family.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_site_identity_font_family_dynamic_css' );
function zeitfresser_site_identity_font_family_dynamic_css() {
$site_identity_font_family = esc_attr( get_theme_mod( 'site_identity_font_family', zeitfresser_get_default_site_identity_font_family() ) );
$dynamic_css = ":root { --site-identity-font-family: $site_identity_font_family; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,5 +0,0 @@
<?php
function zeitfresser_get_default_footer_copyright() {
return "Zeitfresser ©";
}
@@ -1,26 +0,0 @@
<?php
/* Add Default Copyright Text */
require dirname( __FILE__ ) . '/default-footer-copyright.php';
add_action( 'customize_register', 'zeitfresser_customize_register_footer_copyright' );
function zeitfresser_customize_register_footer_copyright( $wp_customize ) {
$wp_customize->add_section( 'daisy_blog_footer_copyright_section', array(
'title' => esc_html__( 'Footer Copyright', 'zeitfresser' ),
'priority' => 24
) );
$wp_customize->add_setting( 'footer_copyright_text', array(
'sanitize_callback' => 'wp_kses_post',
'default' => zeitfresser_get_default_footer_copyright()
) );
$wp_customize->add_control( 'footer_copyright_text', array(
'label' => esc_html__( 'Copyright Text', 'zeitfresser' ),
'section' => 'daisy_blog_footer_copyright_section',
'settings' => 'footer_copyright_text',
'type'=> 'textarea',
) );
}
@@ -1,64 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_container_width' );
function zeitfresser_container_width( $wp_customize ) {
$general_title = '<hr/><h2>' . esc_html__( 'General:', 'zeitfresser' ) . '</h2>';
$wp_customize->add_setting(
'zeitfresser_general_title',
array(
'default' => '',
'sanitize_callback' => 'wp_kses_post',
)
);
$wp_customize->add_control(
new Daisy_Blog_Custom_Text(
$wp_customize,
'zeitfresser_general_title',
array(
'section' => 'daisy_blog_general_customization_section',
'label' => $general_title,
'priority' => 5,
)
)
);
$wp_customize->add_setting('container_width', array(
'default' => zeitfresser_get_default_container_width(),
'sanitize_callback' => 'absint',
'transport' => 'postMessage',
));
$wp_customize->add_control( 'container_width', array(
'label' => esc_html__('Container Width', 'zeitfresser'),
'section' => 'daisy_blog_general_customization_section',
'type' => 'number',
'priority' => 10,
'input_attrs' => array(
'min' => 1000,
'max' => 1600
) )
);
}
add_action( 'customize_preview_init', 'zeitfresser_container_width_enqueue_scripts' );
function zeitfresser_container_width_enqueue_scripts() {
wp_enqueue_script( 'graphthemes-container-width-customizer', get_template_directory_uri() . '/inc/blocks/general/container-width/customizer-container-width.js', array('jquery'), '', true );
}
add_action( 'wp_enqueue_scripts', 'zeitfresser_container_width_dynamic_css' );
function zeitfresser_container_width_dynamic_css() {
$container_width = esc_attr( get_theme_mod( 'container_width', zeitfresser_get_default_container_width() ) );
$container_width .= 'px';
$dynamic_css = ":root { --container-width: $container_width; }";
wp_add_inline_style( 'zeitfresser', $dynamic_css );
}
@@ -1,10 +0,0 @@
jQuery( function( $ ) {
wp.customize('container_width',function ( value ) {
value.bind(function ( to ) {
document.body.style.setProperty('--container-width', to+"px");
}
);
} );
} );
-25
View File
@@ -1,25 +0,0 @@
<?php
/* Default General Customization */
function zeitfresser_get_default_breadcrumbs() {
return false;
}
function zeitfresser_get_default_sticky_menu() {
return false;
}
function zeitfresser_get_default_container_width() {
return 1400;
}
function zeitfresser_get_default_show_article_toc() {
return true;
}
function zeitfresser_get_default_article_toc_min_headlines() {
return 3;
}
-30
View File
@@ -1,30 +0,0 @@
<?php
/**
* General customizer section.
*/
add_action( 'customize_register', 'zeitfresser_register_general_customization_section' );
/**
* Register the general options section.
*
* @param WP_Customize_Manager $wp_customize Customizer manager.
* @return void
*/
function zeitfresser_register_general_customization_section( $wp_customize ) {
$wp_customize->add_section(
'daisy_blog_general_customization_section',
array(
'title' => esc_html__( 'General Options', 'zeitfresser' ),
'priority' => 21,
)
);
}
require dirname( __FILE__ ) . '/default-general.php';
require dirname( __FILE__ ) . '/container-width/container-width.php';
require dirname( __FILE__ ) . '/social-links/social-links.php';
require dirname( __FILE__ ) . '/toc-options.php';
require dirname( __FILE__ ) . '/../post-snippet/default-post-snippet.php';
require dirname( __FILE__ ) . '/../post-snippet/excerpt/excerpt.php';
-99
View File
@@ -1,99 +0,0 @@
<?php
/**
* TOC related general settings.
*/
add_action( 'customize_register', 'zeitfresser_register_article_toc_options' );
/**
* Sanitize the minimum heading threshold for the article TOC.
*
* @param mixed $value Submitted control value.
* @return int
*/
function zeitfresser_sanitize_article_toc_min_headlines( $value ) {
$value = absint( $value );
if ( $value < 1 ) {
$value = zeitfresser_get_default_article_toc_min_headlines();
}
return min( 50, $value );
}
/**
* Register article TOC options in General Options.
*
* @param WP_Customize_Manager $wp_customize Customizer manager.
* @return void
*/
function zeitfresser_register_article_toc_options( $wp_customize ) {
$article_toc_title = '<hr/><h2>' . esc_html__( 'Article TOC:', 'zeitfresser' ) . '</h2>';
$wp_customize->add_setting(
'article_toc_options_heading',
array(
'sanitize_callback' => 'wp_kses_post',
)
);
$wp_customize->add_control(
new Daisy_Blog_Custom_Text(
$wp_customize,
'article_toc_options_heading',
array(
'section' => 'daisy_blog_general_customization_section',
'label' => $article_toc_title,
'priority' => 12,
)
)
);
$wp_customize->add_setting(
'show_article_toc',
array(
'sanitize_callback' => 'zeitfresser_sanitize_checkbox',
'default' => zeitfresser_get_default_show_article_toc(),
)
);
$wp_customize->add_control(
new Graphthemes_Toggle_Control(
$wp_customize,
'show_article_toc',
array(
'settings' => 'show_article_toc',
'section' => 'daisy_blog_general_customization_section',
'label' => esc_html__( 'Show Article TOC', 'zeitfresser' ),
'description' => esc_html__( 'Enable the floating article TOC on single posts. Default: enabled.', 'zeitfresser' ),
'type' => 'toggle',
'priority' => 13,
)
)
);
$wp_customize->add_setting(
'article_toc_min_headlines',
array(
'sanitize_callback' => 'zeitfresser_sanitize_article_toc_min_headlines',
'default' => zeitfresser_get_default_article_toc_min_headlines(),
)
);
$wp_customize->add_control(
'article_toc_min_headlines',
array(
'settings' => 'article_toc_min_headlines',
'type' => 'number',
'section' => 'daisy_blog_general_customization_section',
'label' => esc_html__( 'Number of Headlines to Start TOC', 'zeitfresser' ),
'description' => esc_html__( 'The article TOC is shown only when this number of headings or more is found. Default: 3.', 'zeitfresser' ),
'priority' => 14,
'input_attrs' => array(
'min' => 1,
'max' => 50,
'step' => 1,
),
)
);
}
-18
View File
@@ -1,18 +0,0 @@
#customize-controls .control-section-button .accordion-section-title:hover,
#customize-controls .control-section-button .accordion-section-title:focus {
background-color: #fff;
}
.control-section-button .accordion-section-title .button {
margin-top: -4px;
font-weight: 400;
margin-left: 8px;
background: #e45157;
border: none;
color: #fff;
}
.rtl .control-section-button .accordion-section-title .button {
margin-left: 0;
margin-right: 8px;
}
-15
View File
@@ -1,15 +0,0 @@
(function (api) {
if (api != null) {
// Extends our custom "upgrade-to-pro" section.
api.sectionConstructor["button"] = api.Section.extend({
// No events for this type of section.
attachEvents: function () {},
// Always make the section active.
isContextuallyActive: function () {
return true;
},
});
} else {
}
})(wp.customize);
@@ -1,74 +0,0 @@
<?php
/**
* Pro customizer section.
*
* @since 1.0.0
* @access public
*/
class Daisy_Blog_Button_Control extends WP_Customize_Section {
/**
* The type of customize section being rendered.
*
* @since 1.0.0
* @access public
* @var string
*/
public $type = 'button';
/**
* Custom button text to output.
*
* @since 1.0.0
* @access public
* @var string
*/
public $pro_text = '';
/**
* Custom pro button URL.
*
* @since 1.0.0
* @access public
* @var string
*/
public $pro_url = '';
/**
* Add custom parameters to pass to the JS via JSON.
*
* @since 1.0.0
* @access public
* @return void
*/
public function json() {
$json = parent::json();
$json['pro_text'] = $this->pro_text;
$json['pro_url'] = esc_url( $this->pro_url );
return $json;
}
/**
* Outputs the Underscore.js template.
*
* @since 1.0.0
* @access public
* @return void
*/
protected function render_template() { ?>
<li id="accordion-section-{{ data.id }}" class="accordion-section control-section control-section-{{ data.type }} cannot-expand">
<h3 class="accordion-section-title">
{{ data.title }}
<# if ( data.pro_text && data.pro_url ) { #>
<a href="{{ data.pro_url }}" class="button button-secondary alignright" target="_blank">{{ data.pro_text }}</a>
<# } #>
</h3>
</li>
<?php }
}
@@ -1,24 +0,0 @@
<?php
if( class_exists( 'WP_Customize_control' ) ){
class Daisy_Blog_Custom_Text extends WP_Customize_Control
{
/**
* Render the content on the theme customizer page
*/
public function render_content()
{
?>
<label>
<strong class="customize-text_editor"><?php echo wp_kses_post( $this->label ); ?></strong>
<br />
<span class="customize-text_editor_desc">
<?php echo wp_kses_post( $this->description ); ?>
</span>
</label>
<?php
}
}//editor close
}//class close
@@ -1,86 +0,0 @@
<?php
/**
* Customizer Control: multi-check
*
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'Graphthemes_Multi_Check_Control' ) ) {
/**
* Adds a multicheck control.
*/
class Graphthemes_Multi_Check_Control extends Wp_Customize_Control {
/**
* The control type.
*
* @access public
* @var string
*/
public $type = 'multi-check';
public $tooltip = '';
public function to_json() {
parent::to_json();
if ( isset( $this->default ) ) {
$this->json['default'] = $this->default;
} else {
$this->json['default'] = $this->setting->default;
}
$this->json['value'] = $this->value();
$this->json['choices'] = $this->choices;
$this->json['link'] = $this->get_link();
$this->json['id'] = $this->id;
$this->json['tooltip'] = $this->tooltip;
$this->json['inputAttrs'] = '';
foreach ( $this->input_attrs as $attr => $value ) {
$this->json['inputAttrs'] .= $attr . '="' . esc_attr( $value ) . '" ';
}
}
public function enqueue() {
wp_enqueue_script( 'graphthemes-multi-check', get_template_directory_uri() . '/inc/blocks/includes/multicheck/multi-check.js', array( 'jquery' ), false, true );
}
protected function content_template() {
?>
<# if ( ! data.choices ) { return; } #>
<# if ( data.tooltip ) { #>
<a href="#" class="tooltip hint--left" data-hint="{{ data.tooltip }}"><span class='dashicons dashicons-info'></span></a>
<# } #>
<# if ( data.label ) { #>
<span class="customize-control-title">{{ data.label }}</span>
<# } #>
<# if ( data.description ) { #>
<span class="description customize-control-description">{{{ data.description }}}</span>
<# } #>
<ul>
<# for ( key in data.choices ) { #>
<li>
<label>
<input type="checkbox" value="{{ key }}"<# if ( _.contains( data.value, key ) ) { #> checked<# } #> />
{{ data.choices[ key ] }}
</label>
</li>
<# } #>
</ul>
<?php
}
}
}
@@ -1,30 +0,0 @@
wp.customize.controlConstructor['multi-check'] = wp.customize.Control.extend({
// When we're finished loading continue processing.
ready: function() {
'use strict';
var control = this;
// Save the value
control.container.on( 'change', 'input', function() {
var value = [],
i = 0;
// Build the value as an object using the sub-values from individual checkboxes.
jQuery.each( control.params.choices, function( key, subValue ) {
if ( control.container.find( 'input[value="' + key + '"]' ).is( ':checked' ) ) {
value[ i ] = key;
i++;
}
});
// Update the value in the customizer.
control.setting.set( value );
});
}
});
-17
View File
@@ -1,17 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_register_custom_controls' );
function zeitfresser_register_custom_controls( $wp_customize ) {
require_once ZEITFRESSER_BLOCKS_DIR_PATH . '/includes/button/class-button-control.php';
$wp_customize->register_control_type( 'Daisy_Blog_Button_Control' );
require_once ZEITFRESSER_BLOCKS_DIR_PATH . '/includes//custom-html/class-custom-html.php';
require_once ZEITFRESSER_BLOCKS_DIR_PATH . '/includes/toggle/class-toggle-control.php';
$wp_customize->register_control_type( 'Graphthemes_Toggle_Control' );
require_once ZEITFRESSER_BLOCKS_DIR_PATH . '/includes//multicheck/class-multi-check-control.php';
$wp_customize->register_control_type( 'Graphthemes_Multi_Check_Control' );
}
-50
View File
@@ -1,50 +0,0 @@
<?php
/* Sanitize Google Fonts */
function zeitfresser_sanitize_google_fonts( $input, $setting ) {
// Get list of choices from the control associated with the setting.
$choices = $setting->manager->get_control( $setting->id )->choices;
// If the input is a valid key, return it; otherwise, return the default.
return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}
function zeitfresser_sanitize_float( $input ) {
return filter_var($input, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
}
//checkbox sanitization function
function zeitfresser_sanitize_checkbox( $input ) {
//returns true if checkbox is checked
return ( ( isset( $input ) && true == $input ) ? true : false );
}
function zeitfresser_sanitize_select( $input, $setting ) {
// Ensure input is a slug.
$input = sanitize_key( $input );
// Get list of choices from the control associated with the setting.
$choices = $setting->manager->get_control( $setting->id )->choices;
// If the input is a valid key, return it; otherwise, return the default.
return ( array_key_exists( $input, $choices ) ? $input : $setting->default );
}
function zeitfresser_sanitize_array( $value ){
if ( is_array( $value ) ) {
foreach ( $value as $key => $subvalue ) {
$value[ $key ] = esc_attr( $subvalue );
}
return $value;
}
return esc_attr( $value );
}
@@ -1,56 +0,0 @@
<script type="text/javascript">
var fb = '<?php echo esc_html__( "Facebook", 'zeitfresser' ); ?>';
var twitter = '<?php echo esc_html__( "Twitter", 'zeitfresser' ); ?>';
var pinterest = '<?php echo esc_html__( "Pinterest", 'zeitfresser' ); ?>';
var linkedin = '<?php echo esc_html__( "Linkedin", 'zeitfresser' ); ?>';
</script>
<?php
$url = urlencode(get_the_permalink());
$title = html_entity_decode(get_the_title(), ENT_COMPAT, 'UTF-8');
$media = urlencode(get_the_post_thumbnail_url(get_the_ID(), 'full'));
$twitter_id = get_theme_mod('twitter_id');
$social_share = $args;
?>
<ul class="list-inline">
<li><?php esc_html_e( "Share", 'zeitfresser' ); ?>:</li>
<?php if( in_array( 'facebook', $social_share ) ) { ?>
<li><a href="https://www.facebook.com/sharer/sharer.php?u=<?php echo $url; ?>" onclick="return ! window.open( this.href, fb, 'width=500, height=500' )">
<svg version="1.1" viewBox="0 0 56.693 56.693" width="56.693px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M40.43,21.739h-7.645v-5.014c0-1.883,1.248-2.322,2.127-2.322c0.877,0,5.395,0,5.395,0V6.125l-7.43-0.029 c-8.248,0-10.125,6.174-10.125,10.125v5.518h-4.77v8.53h4.77c0,10.947,0,24.137,0,24.137h10.033c0,0,0-13.32,0-24.137h6.77 L40.43,21.739z"/></svg></a></li>
<?php } ?>
<?php if( in_array( 'twitter', $social_share ) ) { ?>
<li><a href="https://twitter.com/intent/tweet?text=<?php echo $title; ?>&amp;url=<?php echo $url; ?>&amp;via=<?php echo esc_html( $twitter_id ); ?>" onclick="return ! window.open( this.href, twitter, 'width=500, height=500' )">
<svg version="1.1" viewBox="0 0 512 512" width="512px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M492,109.5c-17.4,7.7-36,12.9-55.6,15.3c20-12,35.4-31,42.6-53.6c-18.7,11.1-39.4,19.2-61.5,23.5 C399.8,75.8,374.6,64,346.8,64c-53.5,0-96.8,43.4-96.8,96.9c0,7.6,0.8,15,2.5,22.1C172,179,100.6,140.4,52.9,81.7 c-8.3,14.3-13.1,31-13.1,48.7c0,33.6,17.1,63.3,43.1,80.7C67,210.7,52,206.3,39,199c0,0.4,0,0.8,0,1.2c0,47,33.4,86.1,77.7,95 c-8.1,2.2-16.7,3.4-25.5,3.4c-6.2,0-12.3-0.6-18.2-1.8c12.3,38.5,48.1,66.5,90.5,67.3c-33.1,26-74.9,41.5-120.3,41.5 c-7.8,0-15.5-0.5-23.1-1.4C62.9,432,113.8,448,168.4,448C346.6,448,444,300.3,444,172.2c0-4.2-0.1-8.4-0.3-12.5 C462.6,146,479,128.9,492,109.5z"/></svg>
</a>
</li>
<?php } ?>
<?php if( in_array( 'pinterest', $social_share ) ) { ?>
<li><a href="http://pinterest.com/pin/create/button/?url=<?php echo $url; ?>&amp;media=<?php echo $media; ?>&amp;description=<?php echo esc_html( $title ); ?>" onclick="return ! window.open( this.href, pinterest, 'width=500, height=500' )">
<svg viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M12.486,4.771c-4.23,0-6.363,3.033-6.363,5.562c0,1.533,0.581,2.894,1.823,3.401c0.205,0.084,0.387,0.004,0.446-0.221 c0.041-0.157,0.138-0.553,0.182-0.717c0.061-0.221,0.037-0.3-0.127-0.495c-0.359-0.422-0.588-0.972-0.588-1.747 c0-2.25,1.683-4.264,4.384-4.264c2.392,0,3.706,1.463,3.706,3.412c0,2.568-1.137,4.734-2.824,4.734 c-0.932,0-1.629-0.77-1.405-1.715c0.268-1.13,0.786-2.347,0.786-3.16c0-0.729-0.392-1.336-1.2-1.336 c-0.952,0-1.718,0.984-1.718,2.304c0,0.841,0.286,1.409,0.286,1.409s-0.976,4.129-1.146,4.852c-0.34,1.44-0.051,3.206-0.025,3.385 c0.013,0.104,0.149,0.131,0.21,0.051c0.088-0.115,1.223-1.517,1.607-2.915c0.111-0.396,0.627-2.445,0.627-2.445 c0.311,0.589,1.213,1.108,2.175,1.108c2.863,0,4.804-2.608,4.804-6.103C18.123,7.231,15.886,4.771,12.486,4.771z"/></g></svg>
</a>
</li>
<?php } ?>
<?php if( in_array( 'linkedin', $social_share ) ) { ?>
<li><a href="https://www.linkedin.com/shareArticle?mini=true&url=<?php echo $url; ?>&title=<?php echo esc_html( $title ); ?>" onclick="return ! window.open( this.href, linkedin, 'width=500, height=500' )">
<svg baseProfile="tiny" version="1.2" viewBox="0 0 24 24" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g><path d="M8,19H5V9h3V19z M19,19h-3v-5.342c0-1.392-0.496-2.085-1.479-2.085c-0.779,0-1.273,0.388-1.521,1.165C13,14,13,19,13,19h-3 c0,0,0.04-9,0-10h2.368l0.183,2h0.062c0.615-1,1.598-1.678,2.946-1.678c1.025,0,1.854,0.285,2.487,1.001 C18.683,11.04,19,12.002,19,13.353V19z"/></g><g><ellipse cx="6.5" cy="6.5" rx="1.55" ry="1.5"/></g></svg>
</a>
</li>
<?php } ?>
<?php if( in_array( 'email', $social_share ) ) { ?>
<li><a href="mailto:?subject=<?php echo esc_attr( $title ); ?>&body=<?php echo $title . " " . $url; ?>" target="_blank">
<svg version="1.1" viewBox="0 0 100.354 100.352" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M93.09,76.224c0.047-0.145,0.079-0.298,0.079-0.459V22.638c0-0.162-0.032-0.316-0.08-0.462 c-0.007-0.02-0.011-0.04-0.019-0.06c-0.064-0.171-0.158-0.325-0.276-0.46c-0.008-0.009-0.009-0.02-0.017-0.029 c-0.005-0.005-0.011-0.007-0.016-0.012c-0.126-0.134-0.275-0.242-0.442-0.323c-0.013-0.006-0.023-0.014-0.036-0.02 c-0.158-0.071-0.33-0.111-0.511-0.123c-0.018-0.001-0.035-0.005-0.053-0.005c-0.017-0.001-0.032-0.005-0.049-0.005H8.465 c-0.017,0-0.033,0.004-0.05,0.005c-0.016,0.001-0.032,0.004-0.048,0.005c-0.183,0.012-0.358,0.053-0.518,0.125 c-0.01,0.004-0.018,0.011-0.028,0.015c-0.17,0.081-0.321,0.191-0.448,0.327c-0.005,0.005-0.011,0.006-0.016,0.011 c-0.008,0.008-0.009,0.019-0.017,0.028c-0.118,0.135-0.213,0.29-0.277,0.461c-0.008,0.02-0.012,0.04-0.019,0.061 c-0.048,0.146-0.08,0.3-0.08,0.462v53.128c0,0.164,0.033,0.32,0.082,0.468c0.007,0.02,0.011,0.039,0.018,0.059 c0.065,0.172,0.161,0.327,0.28,0.462c0.007,0.008,0.009,0.018,0.016,0.026c0.006,0.007,0.014,0.011,0.021,0.018 c0.049,0.051,0.103,0.096,0.159,0.14c0.025,0.019,0.047,0.042,0.073,0.06c0.066,0.046,0.137,0.083,0.21,0.117 c0.018,0.008,0.034,0.021,0.052,0.028c0.181,0.077,0.38,0.121,0.589,0.121h83.204c0.209,0,0.408-0.043,0.589-0.121 c0.028-0.012,0.054-0.03,0.081-0.044c0.062-0.031,0.124-0.063,0.181-0.102c0.03-0.021,0.057-0.048,0.086-0.071 c0.051-0.041,0.101-0.082,0.145-0.129c0.008-0.008,0.017-0.014,0.025-0.022c0.008-0.009,0.01-0.021,0.018-0.03 c0.117-0.134,0.211-0.288,0.275-0.458C93.078,76.267,93.083,76.246,93.09,76.224z M9.965,26.04l25.247,23.061L9.965,72.346V26.04z M61.711,47.971c-0.104,0.068-0.214,0.125-0.301,0.221c-0.033,0.036-0.044,0.083-0.073,0.121l-11.27,10.294L12.331,24.138h75.472 L61.711,47.971z M37.436,51.132l11.619,10.613c0.287,0.262,0.649,0.393,1.012,0.393s0.725-0.131,1.011-0.393l11.475-10.481 l25.243,23.002H12.309L37.436,51.132z M64.778,49.232L90.169,26.04v46.33L64.778,49.232z"/></svg></a>
</li>
<?php } ?>
</ul>
@@ -1,65 +0,0 @@
<?php
/**
* Customizer Control: toggle.
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
if ( ! class_exists( 'Graphthemes_Toggle_Control' ) ) {
/**
* Toggle control (modified checkbox).
*/
class Graphthemes_Toggle_Control extends Wp_Customize_Control {
public $type = 'toggle';
public $tooltip = '';
public function to_json() {
parent::to_json();
if ( isset( $this->default ) ) {
$this->json['default'] = $this->default;
} else {
$this->json['default'] = $this->setting->default;
}
$this->json['value'] = $this->value();
$this->json['link'] = $this->get_link();
$this->json['id'] = $this->id;
$this->json['tooltip'] = $this->tooltip;
$this->json['inputAttrs'] = '';
foreach ( $this->input_attrs as $attr => $value ) {
$this->json['inputAttrs'] .= $attr . '="' . esc_attr( $value ) . '" ';
}
}
public function enqueue() {
wp_enqueue_style( 'graphthemes-toggle', get_template_directory_uri() . '/inc/blocks/includes/toggle/toggle.css', null );
wp_enqueue_script( 'graphthemes-toggle', get_template_directory_uri() . '/inc/blocks/includes/toggle/toggle.js', array( 'jquery' ), false, true ); //for toggle
}
protected function content_template() {
?>
<# if ( data.tooltip ) { #>
<a href="#" class="tooltip hint--left" data-hint="{{ data.tooltip }}"><span class='dashicons dashicons-info'></span></a>
<# } #>
<label for="toggle_{{ data.id }}">
<span class="customize-control-title">
{{{ data.label }}}
</span>
<# if ( data.description ) { #>
<span class="description customize-control-description">{{{ data.description }}}</span>
<# } #>
<input {{{ data.inputAttrs }}} name="toggle_{{ data.id }}" id="toggle_{{ data.id }}" type="checkbox" value="{{ data.value }}" {{{ data.link }}}<# if ( '1' == data.value ) { #> checked<# } #> hidden />
<span class="switch"></span>
</label>
<?php
}
}
}
-64
View File
@@ -1,64 +0,0 @@
.customize-control-toggle label {
display: flex;
flex-wrap: wrap;
}
.customize-control-toggle label .customize-control-title {
width: calc(100% - 55px);
}
.customize-control-toggle label .description {
order: 99;
}
.customize-control-toggle input[type="checkbox"] {
display: none;
}
.customize-control-toggle .switch {
border: 1px solid rgba(0, 0, 0, 0.1);
display: inline-block;
width: 35px;
height: 12px;
border-radius: 8px;
background: #ccc;
vertical-align: middle;
position: relative;
cursor: pointer;
user-select: none;
transition: background 350ms ease;
}
.customize-control-toggle .switch:before, .customize-control-toggle .switch:after {
content: "";
display: block;
width: 20px;
height: 20px;
border-radius: 50%;
position: absolute;
top: 50%;
left: -3px;
transition: all 350ms cubic-bezier(0, 0.95, 0.38, 0.98), background 150ms ease;
}
.customize-control-toggle .switch:before {
background: rgba(0, 0, 0, 0.2);
transform: translate3d(0, -50%, 0) scale(0);
}
.customize-control-toggle .switch:after {
background: #999;
border: 1px solid rgba(0, 0, 0, 0.1);
transform: translate3d(0, -50%, 0);
}
.customize-control-toggle .switch:active:before {
transform: translate3d(0, -50%, 0) scale(3);
}
.customize-control-toggle input:checked + .switch {
background: rgba(52, 152, 222, 0.3);
}
.customize-control-toggle input:checked + .switch:before {
background: rgba(52, 152, 222, 0.075);
transform: translate3d(100%, -50%, 0) scale(1);
}
.customize-control-toggle input:checked + .switch:after {
background: #3498DE;
transform: translate3d(100%, -50%, 0);
}
.customize-control-toggle input:checked + .switch:active:before {
background: rgba(52, 152, 222, 0.075);
transform: translate3d(100%, -50%, 0) scale(3);
}
-18
View File
@@ -1,18 +0,0 @@
wp.customize.controlConstructor['toggle'] = wp.customize.Control.extend({
ready: function() {
'use strict';
var control = this,
checkboxValue = control.setting._value;
// Save the value
this.container.on( 'change', 'input', function() {
checkboxValue = ( jQuery( this ).is( ':checked' ) ) ? true : false;
control.setting.set( checkboxValue );
});
}
});
@@ -1,61 +0,0 @@
<?php
/* Default Post Detail Author*/
function zeitfresser_get_default_post_detail_author() {
return false;
}
/* Default Post Detail Category*/
function zeitfresser_get_default_post_detail_category() {
return false;
}
/* Default Post Detail Comment*/
function zeitfresser_get_default_post_detail_comment() {
return true;
}
/* Default Post Detail Date*/
function zeitfresser_get_default_post_detail_date() {
return true;
}
/* Default Post Detail Featured Image*/
function zeitfresser_get_default_post_detail_featured_image() {
return false;
}
/* Default Post Detail Tag*/
function zeitfresser_get_default_post_detail_featured_image_size() {
return esc_html__( 'large', 'zeitfresser' );
}
/* Default Post Detail Tag*/
function zeitfresser_get_default_post_detail_tag() {
return false;
}
/* Default Post Detail Social Share */
function zeitfresser_get_default_post_detail_social_share() {
return false;
}
/* Default Post Detail Social Share Options*/
function zeitfresser_get_default_post_detail_social_share_options() {
return array();
}
/* Default Post Detail Author Block Options */
function zeitfresser_get_default_post_detail_author_block() {
return false;
}
/* Default Post Detail Related Articles Options*/
function zeitfresser_get_default_post_detail_related_articles() {
return true;
}
/* Default Post Detail Related Articles Title */
function zeitfresser_get_default_post_detail_related_articles_title() {
return esc_html__( "Related Articles", 'zeitfresser' );
}
-9
View File
@@ -1,9 +0,0 @@
<?php
/**
* Post detail defaults only.
*
* The frontend still uses these defaults, but the related controls are intentionally
* hidden to keep the customizer lean for the Zeitfresser setup.
*/
require dirname( __FILE__ ) . '/default-post-detail.php';
@@ -1,61 +0,0 @@
<?php
/* Default Post Snippet Author*/
function zeitfresser_get_default_post_snippet_author() {
return false;
}
/* Default Post Snippet Category*/
function zeitfresser_get_default_post_snippet_category() {
return false;
}
/* Default Post Snippet Comment*/
function zeitfresser_get_default_post_snippet_comment() {
return false;
}
/* Default Post Snippet Date*/
function zeitfresser_get_default_post_snippet_date() {
return false;
}
/* Default Post Snippet Featured Image*/
function zeitfresser_get_default_post_snippet_featured_image() {
return true;
}
/* Default Post Snippet Tag*/
function zeitfresser_get_default_post_snippet_featured_image_size() {
return esc_html__( 'thumbnail', 'zeitfresser' );
}
/* Default Post Snippet Tag*/
function zeitfresser_get_default_post_snippet_tag() {
return false;
}
/* Default Post Snippet Excerpt Szie */
function zeitfresser_get_default_post_snippet_excerpt_size() {
return 20;
}
/* Default Post Snippet Read More */
function zeitfresser_get_default_post_snippet_show_hide_read_more() {
return false;
}
/* Default Post Snippet Read More Text */
function zeitfresser_get_default_post_snippet_read_more_text() {
return esc_html__( "Read More", 'zeitfresser' );
}
/* Default Post Snippet Social Share */
function zeitfresser_get_default_post_snippet_social_share() {
return false;
}
/* Default Post Snippet Social Share Options*/
function zeitfresser_get_default_post_snippet_social_share_options() {
return array();
}
@@ -1,23 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_post_snippet_excerpt_size' );
function zeitfresser_post_snippet_excerpt_size( $wp_customize ) {
$wp_customize->add_setting( 'post_snippet_excerpt_size', array(
'sanitize_callback' => 'absint',
'default' => zeitfresser_get_default_post_snippet_excerpt_size()
) );
$wp_customize->add_control( 'post_snippet_excerpt_size', array(
'settings' => 'post_snippet_excerpt_size',
'type' => 'number',
'section' => 'daisy_blog_general_customization_section',
'label' => esc_html__( 'Excerpt Size', 'zeitfresser' ),
'priority' => 11,
'input_attrs' => array(
'min' => 5,
'max' => 80,
),
) );
}
-25
View File
@@ -1,25 +0,0 @@
<?php
/**
* Post snippet customizer section.
*/
add_action( 'customize_register', 'zeitfresser_register_post_snippet_customization_section' );
/**
* Register the post snippet section.
*
* @param WP_Customize_Manager $wp_customize Customizer manager.
* @return void
*/
function zeitfresser_register_post_snippet_customization_section( $wp_customize ) {
$wp_customize->add_section(
'daisy_blog_post_snippet_customization_section',
array(
'title' => esc_html__( 'Post Snippet', 'zeitfresser' ),
'priority' => 22,
)
);
}
require dirname( __FILE__ ) . '/default-post-snippet.php';
require dirname( __FILE__ ) . '/excerpt/excerpt.php';
@@ -1,11 +0,0 @@
<?php
/* Default Site Title Show Hide Option */
function zeitfresser_get_default_site_title_show_hide() {
return true;
}
/* Default Site Tagline Show Hide Option */
function zeitfresser_get_default_site_tagline_show_hide() {
return true;
}
@@ -1,9 +0,0 @@
<?php
/* Default Site Identity Settings */
require dirname( __FILE__ ) . '/default-site-identity.php';
require dirname( __FILE__ ) . '/site-title/site-title.php';
require dirname( __FILE__ ) . '/site-tagline/site-tagline.php';
@@ -1,18 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_show_hide_site_tagline' );
function zeitfresser_show_hide_site_tagline( $wp_customize ) {
$wp_customize->add_setting( 'show_hide_site_tagline', array(
'sanitize_callback' => 'zeitfresser_sanitize_checkbox',
'default' => zeitfresser_get_default_site_tagline_show_hide()
) );
$wp_customize->add_control( new Graphthemes_Toggle_Control( $wp_customize, 'show_hide_site_tagline', array(
'label' => esc_html__( 'Show/Hide Site Tagline','zeitfresser' ),
'section' => 'title_tagline',
'settings' => 'show_hide_site_tagline',
'type'=> 'toggle',
) ) );
}
@@ -1,18 +0,0 @@
<?php
add_action( 'customize_register', 'zeitfresser_show_hide_site_title' );
function zeitfresser_show_hide_site_title( $wp_customize ) {
$wp_customize->add_setting( 'show_hide_site_title', array(
'sanitize_callback' => 'zeitfresser_sanitize_checkbox',
'default' => zeitfresser_get_default_site_title_show_hide(),
) );
$wp_customize->add_control( new Graphthemes_Toggle_Control( $wp_customize, 'show_hide_site_title', array(
'label' => esc_html__( 'Show/Hide Site Title','zeitfresser' ),
'section' => 'title_tagline',
'settings' => 'show_hide_site_title',
'type'=> 'toggle',
) ) );
}
-78
View File
@@ -1,78 +0,0 @@
<?php
/**
* Sample implementation of the Custom Header feature
*
* You can add an optional custom header image to header.php like so ...
*
<?php the_header_image_tag(); ?>
*
* @link https://developer.wordpress.org/themes/functionality/custom-headers/
*
* @package zeitfresser
*/
/**
* Set up the WordPress core custom header feature.
*
* @uses zeitfresser_header_style()
*/
function zeitfresser_custom_header_setup() {
add_theme_support(
'custom-header',
apply_filters(
'daisy_blog_custom_header_args',
array(
'default-image' => '',
'default-text-color' => '444444',
'width' => 1000,
'height' => 250,
'flex-height' => true,
'wp-head-callback' => 'zeitfresser_header_style',
)
)
);
}
add_action( 'after_setup_theme', 'zeitfresser_custom_header_setup' );
if ( ! function_exists( 'zeitfresser_header_style' ) ) :
/**
* Styles the header image and text displayed on the blog.
*
* @see zeitfresser_custom_header_setup().
*/
function zeitfresser_header_style() {
$header_text_color = get_header_textcolor();
/*
* If no custom options for text are set, let's bail.
* get_header_textcolor() options: Any hex value, 'blank' to hide text. Default: add_theme_support( 'custom-header' ).
*/
if ( get_theme_support( 'custom-header', 'default-text-color' ) === $header_text_color ) {
return;
}
// If we get this far, we have custom styles. Let's do this.
?>
<style type="text/css">
<?php
// Has the text been hidden?
if ( ! display_header_text() ) :
?>
.site-title,
.site-description {
position: absolute;
clip: rect(1px, 1px, 1px, 1px);
}
<?php
// If the user has set a custom color for the text use that.
else :
?>
.site-title a,
.site-description {
color: #<?php echo esc_attr( $header_text_color ); ?>;
}
<?php endif; ?>
</style>
<?php
}
endif;
-61
View File
@@ -1,61 +0,0 @@
<?php
/**
* daisy blog Theme Customizer
*
* @package zeitfresser
*/
/**
* Add postMessage support for site title and description for the Theme Customizer.
*
* @param WP_Customize_Manager $wp_customize Theme Customizer object.
*/
function zeitfresser_customize_register( $wp_customize ) {
$wp_customize->get_setting( 'blogname' )->transport = 'postMessage';
$wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';
$wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage';
if ( isset( $wp_customize->selective_refresh ) ) {
$wp_customize->selective_refresh->add_partial(
'blogname',
array(
'selector' => '.site-title a',
'render_callback' => 'zeitfresser_customize_partial_blogname',
)
);
$wp_customize->selective_refresh->add_partial(
'blogdescription',
array(
'selector' => '.site-description',
'render_callback' => 'zeitfresser_customize_partial_blogdescription',
)
);
}
}
add_action( 'customize_register', 'zeitfresser_customize_register' );
/**
* Render the site title for the selective refresh partial.
*
* @return void
*/
function zeitfresser_customize_partial_blogname() {
bloginfo( 'name' );
}
/**
* Render the site tagline for the selective refresh partial.
*
* @return void
*/
function zeitfresser_customize_partial_blogdescription() {
bloginfo( 'description' );
}
/**
* Binds JS handlers to make Theme Customizer preview reload changes asynchronously.
*/
function zeitfresser_customize_preview_js() {
wp_enqueue_script( 'zeitfresser-customizer', get_template_directory_uri() . '/js/customizer.js', array( 'customize-preview' ), ZEITFRESSER_VERSION, true );
}
add_action( 'customize_preview_init', 'zeitfresser_customize_preview_js' );
+244
View File
@@ -0,0 +1,244 @@
<?php
/**
* Theme Customizer Core
*
* @package zeitfresser
*/
function zeitfresser_customize_register( $wp_customize ) {
// Live Preview support
$wp_customize->get_setting( 'blogname' )->transport = 'postMessage';
$wp_customize->get_setting( 'blogdescription' )->transport = 'postMessage';
$wp_customize->get_setting( 'header_textcolor' )->transport = 'postMessage';
if ( isset( $wp_customize->selective_refresh ) ) {
$wp_customize->selective_refresh->add_partial(
'blogname',
array(
'selector' => '.site-title a',
'render_callback' => 'zeitfresser_customize_partial_blogname',
)
);
$wp_customize->selective_refresh->add_partial(
'blogdescription',
array(
'selector' => '.site-description',
'render_callback' => 'zeitfresser_customize_partial_blogdescription',
)
);
}
/**
* Performance Tools Section
*/
$wp_customize->add_section(
'ztfr_performance_tools',
array(
'title' => 'Performance Tools Settings',
'priority' => 160,
)
);
/**
* Auto Optimize
*/
$wp_customize->add_setting(
'ztfr_auto_optimize',
array(
'default' => true,
'sanitize_callback' => 'wp_validate_boolean',
)
);
$wp_customize->add_control(
'ztfr_auto_optimize',
array(
'type' => 'checkbox',
'section' => 'ztfr_performance_tools',
'label' => 'Auto Optimize Pictures on Upload',
'description' => 'Automatically converts images to AVIF/WebP.',
)
);
/**
* Auto Delete
*/
$wp_customize->add_setting(
'ztfr_auto_delete',
array(
'default' => false,
'sanitize_callback' => 'wp_validate_boolean',
)
);
$wp_customize->add_control(
'ztfr_auto_delete',
array(
'type' => 'checkbox',
'section' => 'ztfr_performance_tools',
'label' => 'Auto Delete Original Pictures',
'description' => 'Deletes originals after optimization.',
)
);
}
add_action( 'customize_register', 'zeitfresser_customize_register' );
/**
* Partial refresh helpers
*/
function zeitfresser_customize_partial_blogname() {
bloginfo( 'name' );
}
function zeitfresser_customize_partial_blogdescription() {
bloginfo( 'description' );
}
/**
* Live preview JS
*/
function zeitfresser_customize_preview_js() {
wp_enqueue_script(
'zeitfresser-customizer',
get_template_directory_uri() . '/js/customizer.js',
array( 'customize-preview' ),
ZEITFRESSER_VERSION,
true
);
}
add_action( 'customize_preview_init', 'zeitfresser_customize_preview_js' );
/**
* Dependency UI logic
*/
function zeitfresser_customize_controls_dependency_js() {
?>
<script>
(function() {
function getOptimizeInput() {
return document.querySelector('#customize-control-ztfr_auto_optimize input');
}
function getDeleteInput() {
return document.querySelector('#customize-control-ztfr_auto_delete input');
}
function getDeleteControl() {
return document.getElementById('customize-control-ztfr_auto_delete');
}
function ensureStatusBox() {
let box = document.getElementById('ztfr-auto-status-box');
if (box) return box;
const optimizeControl = document.getElementById('customize-control-ztfr_auto_optimize');
if (!optimizeControl || !optimizeControl.parentNode) return null;
box = document.createElement('li');
box.id = 'ztfr-auto-status-box';
box.className = 'customize-control';
box.innerHTML =
'<span style="display:block;font-weight:600;margin-bottom:6px;">Current Mode</span>' +
'<span id="ztfr-auto-status-text">Checking...</span>';
optimizeControl.parentNode.insertBefore(box, optimizeControl);
return box;
}
function updateState() {
const optimizeInput = getOptimizeInput();
const deleteInput = getDeleteInput();
const deleteControl = getDeleteControl();
const statusBox = ensureStatusBox();
const statusText = document.getElementById('ztfr-auto-status-text');
if (!optimizeInput || !deleteInput || !deleteControl || !statusBox || !statusText) {
return;
}
if (!optimizeInput.checked) {
deleteInput.checked = false;
deleteInput.disabled = true;
deleteControl.style.opacity = '0.5';
statusText.textContent = '⚪ Manual Mode (no automation)';
} else {
deleteInput.disabled = false;
deleteControl.style.opacity = '1';
if (deleteInput.checked) {
statusText.textContent = '🟢 Full Auto Mode (optimize + delete)';
} else {
statusText.textContent = '🟡 Auto Optimize enabled (originals kept)';
}
}
}
function init() {
let attempts = 0;
function tryInit() {
const optimize = getOptimizeInput();
const del = getDeleteInput();
if (optimize && del) {
updateState();
return;
}
// Retry max 10x
if (attempts < 10) {
attempts++;
setTimeout(tryInit, 200);
}
}
tryInit();
document.addEventListener('change', function(e) {
if (
e.target &&
(
e.target.matches('#customize-control-ztfr_auto_optimize input') ||
e.target.matches('#customize-control-ztfr_auto_delete input')
)
) {
updateState();
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', init);
} else {
init();
}
})();
</script>
<?php
}
add_action( 'customize_controls_enqueue_scripts', 'zeitfresser_customize_controls_dependency_js' );
/**
* Small UI polish
*/
add_action( 'customize_controls_enqueue_scripts', function() {
?>
<style>
#customize-control-ztfr_auto_optimize > label,
#customize-control-ztfr_auto_delete > label {
display:flex;
align-items:flex-start;
gap:6px;
}
</style>
<?php
});
+90
View File
@@ -0,0 +1,90 @@
<?php
/**
* General Theme Options
*
* @package zeitfresser
*/
add_action( 'customize_register', 'zeitfresser_general_options' );
function zeitfresser_general_options( $wp_customize ) {
/**
* General Section (falls nicht schon vorhanden)
*/
if ( ! $wp_customize->get_section( 'ztfr_general' ) ) {
$wp_customize->add_section(
'ztfr_general',
array(
'title' => 'General Options',
'priority' => 30,
)
);
}
/**
* Excerpt Length
*/
$wp_customize->add_setting(
'post_snippet_excerpt_size',
array(
'default' => 20,
'sanitize_callback' => 'absint',
)
);
$wp_customize->add_control(
'post_snippet_excerpt_size',
array(
'type' => 'number',
'section' => 'ztfr_general',
'label' => 'Excerpt Length (Post Cards)',
'description' => 'Number of words shown in post previews.',
'input_attrs' => array(
'min' => 5,
'max' => 100,
'step' => 1,
),
)
);
/**
* Show Site Title
*/
$wp_customize->add_setting(
'show_hide_site_title',
array(
'default' => true,
'sanitize_callback' => 'wp_validate_boolean',
)
);
$wp_customize->add_control(
'show_hide_site_title',
array(
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Site Title',
)
);
/**
* Show Tagline
*/
$wp_customize->add_setting(
'show_hide_site_tagline',
array(
'default' => true,
'sanitize_callback' => 'wp_validate_boolean',
)
);
$wp_customize->add_control(
'show_hide_site_tagline',
array(
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => 'Show Tagline',
)
);
}
+54
View File
@@ -0,0 +1,54 @@
<?php
/**
* Layout / Container Settings
*
* @package zeitfresser
*/
add_action( 'customize_register', 'zeitfresser_layout_options' );
function zeitfresser_layout_options( $wp_customize ) {
/**
* Container Width
*/
$wp_customize->add_setting(
'container_width',
array(
'default' => 1400,
'sanitize_callback' => 'absint',
)
);
$wp_customize->add_control(
'container_width',
array(
'type' => 'number',
'section' => 'ztfr_general',
'label' => esc_html__( 'Container Width', 'zeitfresser' ),
'description' => esc_html__( 'Maximum width of the content container in pixels.', 'zeitfresser' ),
'priority' => 10,
'input_attrs' => array(
'min' => 800,
'max' => 2000,
'step' => 10,
),
)
);
}
/**
* Apply container width via CSS variable
*/
add_action( 'wp_head', 'zeitfresser_container_width_dynamic_css' );
function zeitfresser_container_width_dynamic_css() {
$container_width = (int) get_theme_mod( 'container_width' );
if ( $container_width <= 0 ) {
$container_width = 1140;
}
echo '<style>:root{--container-width:' . esc_attr( $container_width ) . 'px;}</style>';
}
@@ -1,13 +1,13 @@
<?php
/**
* Social links customizer settings.
* Social Links Customizer Options
*
* @package zeitfresser
*/
if ( ! function_exists( 'zeitfresser_get_social_links' ) ) {
/**
* Return supported social network labels.
* Return supported social networks.
*
* @return array<string,string>
*/
@@ -15,7 +15,7 @@ if ( ! function_exists( 'zeitfresser_get_social_links' ) ) {
return array(
'facebook' => esc_html__( 'Facebook', 'zeitfresser' ),
'instagram' => esc_html__( 'Instagram', 'zeitfresser' ),
'youtube' => esc_html__( 'Youtube', 'zeitfresser' ),
'youtube' => esc_html__( 'YouTube', 'zeitfresser' ),
'linkedin' => esc_html__( 'LinkedIn', 'zeitfresser' ),
'twitter' => esc_html__( 'Twitter', 'zeitfresser' ),
'pinterest' => esc_html__( 'Pinterest', 'zeitfresser' ),
@@ -29,54 +29,52 @@ if ( ! function_exists( 'zeitfresser_get_social_links' ) ) {
add_action( 'customize_register', 'zeitfresser_social_links' );
/**
* Register social link customizer controls.
*
* @param WP_Customize_Manager $wp_customize Customizer manager.
* @return void
*/
function zeitfresser_social_links( $wp_customize ) {
$social_links = zeitfresser_get_social_links();
$social_links_title = '<hr/><h2>' . esc_html__( 'Social Links:', 'zeitfresser' ) . '</h2>';
$social_links = zeitfresser_get_social_links();
/**
* Section Divider
*/
$wp_customize->add_setting(
'social_links_title',
'ztfr_social_heading',
array(
'default' => '',
'sanitize_callback' => 'wp_kses_post',
)
);
$wp_customize->add_control(
new Daisy_Blog_Custom_Text(
$wp_customize,
'social_links_title',
array(
'section' => 'daisy_blog_general_customization_section',
'label' => $social_links_title,
'priority' => 20,
)
'ztfr_social_heading',
array(
'section' => 'ztfr_general',
'type' => 'hidden',
'description' => '<hr><strong>' . esc_html__( 'Social Links', 'zeitfresser' ) . '</strong>',
'priority' => 30,
)
);
$social_priority = 21;
/**
* Social URLs
*/
$priority = 31;
foreach ( $social_links as $key => $label ) {
foreach ( $social_links as $social_key => $social_label ) {
$wp_customize->add_setting(
'social_links_' . $social_key,
'social_links_' . $key,
array(
'default' => zeitfresser_get_social_link_default( $social_key ),
'default' => '',
'sanitize_callback' => 'esc_url_raw',
)
);
$wp_customize->add_control(
'social_links_' . $social_key,
'social_links_' . $key,
array(
'label' => $social_label,
'section' => 'daisy_blog_general_customization_section',
'type' => 'url',
'priority' => $social_priority++,
'section' => 'ztfr_general',
'label' => $label,
'priority' => $priority++,
)
);
}
+80
View File
@@ -0,0 +1,80 @@
<?php
/**
* TOC Customizer Options
*
* @package zeitfresser
*/
add_action( 'customize_register', 'zeitfresser_toc_options' );
function zeitfresser_toc_options( $wp_customize ) {
/**
* Section Divider (UI only)
*/
$wp_customize->add_setting(
'ztfr_toc_heading',
array(
'sanitize_callback' => 'wp_kses_post',
)
);
$wp_customize->add_control(
'ztfr_toc_heading',
array(
'section' => 'ztfr_general',
'type' => 'hidden',
'description' => '<hr><strong>' . esc_html__( 'Article TOC', 'zeitfresser' ) . '</strong>',
'priority' => 20,
)
);
/**
* Toggle TOC
*/
$wp_customize->add_setting(
'show_article_toc',
array(
'default' => true,
'sanitize_callback' => 'wp_validate_boolean',
)
);
$wp_customize->add_control(
'show_article_toc',
array(
'type' => 'checkbox',
'section' => 'ztfr_general',
'label' => esc_html__( 'Show Article TOC', 'zeitfresser' ),
'description' => esc_html__( 'Enable floating TOC on single posts.', 'zeitfresser' ),
'priority' => 21,
)
);
/**
* Minimum headlines threshold
*/
$wp_customize->add_setting(
'article_toc_min_headlines',
array(
'default' => 3,
'sanitize_callback' => 'absint',
)
);
$wp_customize->add_control(
'article_toc_min_headlines',
array(
'type' => 'number',
'section' => 'ztfr_general',
'label' => esc_html__( 'Minimum Headlines for TOC', 'zeitfresser' ),
'description' => esc_html__( 'TOC appears only if this number of headings is reached.', 'zeitfresser' ),
'priority' => 22,
'input_attrs' => array(
'min' => 1,
'max' => 50,
'step' => 1,
),
)
);
}
@@ -1,18 +0,0 @@
<?php
if( ! defined( 'DAISY_BLOG_WIDGET_PATH' ) ) {
define( 'DAISY_BLOG_WIDGET_PATH', dirname( __FILE__ ) );
}
/**
* Author Profile Widget.
*/
require_once DAISY_BLOG_WIDGET_PATH . '/includes/class-graphthemes-widget-functions.php';
require_once DAISY_BLOG_WIDGET_PATH . '/includes/widgets/widget-author-profile.php';
require_once DAISY_BLOG_WIDGET_PATH . '/includes/widgets/widget-recent-posts.php';
require_once DAISY_BLOG_WIDGET_PATH . '/includes/widgets/widget-popular-posts.php';
@@ -1,49 +0,0 @@
<?php
class Graphthemes_Widget_Functions {
public function __construct() {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ) );
}
public function enqueue_admin_scripts() {
wp_enqueue_media();
wp_enqueue_script( 'graphthemes-widgets-admin-scripts', get_template_directory_uri() . '/inc/graphthemes-widgets/includes/js/graphthemes-widgets-admin.js', array( 'jquery' ), ZEITFRESSER_VERSION , true );
}
public function zeitfresser_widget_get_attachment_id( $url ) {
$attachment_id = 0;
$dir = wp_upload_dir();
if ( false !== strpos( $url, $dir['baseurl'] . '/' ) ) { // Is URL in uploads directory?
$file = basename( $url );
$query_args = array(
'post_type' => 'attachment',
'post_status' => 'inherit',
'fields' => 'ids',
'meta_query' => array(
array(
'value' => $file,
'compare' => 'LIKE',
'key' => '_wp_attachment_metadata',
),
)
);
$query = new WP_Query( $query_args );
if ( $query->have_posts() ) {
foreach ( $query->posts as $post_id ) {
$meta = wp_get_attachment_metadata( $post_id );
$original_file = basename( $meta['file'] );
$cropped_image_files = wp_list_pluck( $meta['sizes'], 'file' );
if ( $original_file === $file || in_array( $file, $cropped_image_files ) ) {
$attachment_id = $post_id;
break;
}
}
}
}
return $attachment_id;
}
}
$obj = new Graphthemes_Widget_Functions;
@@ -1,36 +0,0 @@
jQuery(document).ready(function($){
$(document).on("click", ".upload_image_button", function(event) {
event.preventDefault();
var $button = $(this);
// Create the media frame.
var file_frame = wp.media.frames.file_frame = wp.media({
title: 'Select or upload image',
library: { // remove these to show all
type: 'image' // specific mime
},
button: {
text: 'Select'
},
multiple: false // Set to true to allow multiple files to be selected
});
// When an image is selected, run a callback.
file_frame.on('select', function () {
// We set multiple to false so only get one image from the uploader
var attachment = file_frame.state().get('selection').first().toJSON();
$button.siblings('input').val(attachment.url).trigger('change');
});
// Finally, open the modal
file_frame.open();
});
});
@@ -1,285 +0,0 @@
<?php
/**
* Widget Author Profile
*/
// register Author Profile Widget
function zeitfresser_register_author_profile_widget() {
register_widget( 'Graphthemes_Author_Profile' );
}
add_action( 'widgets_init', 'zeitfresser_register_author_profile_widget' );
if( ! class_exists( 'Graphthemes_Author_Profile' ) ) :
/**
* Adds Graphthemes_Author_Profile widget.
*/
class Graphthemes_Author_Profile extends WP_Widget {
/**
* Register widget with WordPress.
*/
function __construct() {
parent::__construct(
'daisy_blog_widget_author_profile', // Base ID
__( 'Graphthemes: Author Profile', 'zeitfresser' ), // Name
array( 'description' => __( 'An Author Profile Widget', 'zeitfresser' ), ) // Args
);
}
public function widget( $args, $instance ) {
$title = ! empty( $instance['title'] ) ? $instance['title'] : '';
$name = ! empty( $instance['name'] ) ? $instance['name'] : '';
$email = ! empty( $instance['email'] ) ? $instance['email'] : '';
$content = ! empty( $instance['content'] ) ? $instance['content'] : '';
$image = ! empty( $instance['image'] ) ? $instance['image'] : '';
$author_image = ! empty( $instance['author-image'] ) ? $instance['author-image'] : '';
$label = ! empty( $instance['label'] ) ? $instance['label'] : '';
$link = ! empty( $instance['link'] ) ? $instance['link'] : '';
$target = ! empty( $instance['target'] ) ? $instance['target'] : '';
$attachment_id = $image;
$social_facebook = ! empty( $instance['social-facebook'] ) ? $instance['social-facebook'] : '';
$social_linkedin = ! empty( $instance['social-linkedin'] ) ? $instance['social-linkedin'] : '';
$social_twitter = ! empty( $instance['social-twitter'] ) ? $instance['social-twitter'] : '';
$social_instagram = ! empty( $instance['social-instagram'] ) ? $instance['social-instagram'] : '';
if ( !filter_var( $image, FILTER_VALIDATE_URL ) === false ) {
$attachment_id = $obj->zeitfresser_widget_get_attachment_id( $image );
}
$option = ! empty( $instance['author-image-option'] ) ? $instance['author-image-option'] : 'gravatar';
if( $attachment_id ){
$author_bio_img_size = apply_filters('author_bio_img_size','thumbnail');
}
echo $args['before_widget'];
ob_start();
if( $title ) {
echo $args['before_title'] . apply_filters( 'widget_title', $title, $instance, $this->id_base ) . $args['after_title'];
}
?>
<div class="graphthemes-widget-author-bio-holder">
<div class="image-holder">
<?php
if( $option == 'gravatar' ){
echo get_avatar( $email, 300 );
}
elseif( $option == 'photo' && $author_image ) { ?>
<img src="<?php echo esc_url( $author_image ); ?>">
<?php
}
?>
</div>
<div class="text-holder">
<H5 class="title-holder"><?php echo esc_html( $name ); ?></H5>
<div class="author-bio-content">
<?php echo wpautop( wp_kses_post( $content ) ); ?>
</div>
<?php if( $link && $label ){ ?>
<a <?php if( isset( $instance['target'] ) && $instance['target']=='1' ){ echo "target=_blank"; } ?> href="<?php echo esc_url( $link ); ?>" class="btn-readmore"><?php echo esc_html( $label );?></a>
<?php } ?>
<div class="author-bio-socicons social-share">
<ul class="list-group list-group-horizontal list-inline">
<?php if( isset( $instance['social-facebook'] ) && $instance['social-facebook'] ){ ?>
<li class="social-share-list list-group-item facebook-svg">
<a target="_blank" href="<?php echo esc_url( $instance['social-facebook'] );?>">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512"><path d="M279.14 288l14.22-92.66h-88.91v-60.13c0-25.35 12.42-50.06 52.24-50.06h40.42V6.26S260.43 0 225.36 0c-73.22 0-121.08 44.38-121.08 124.72v70.62H22.89V288h81.39v224h100.17V288z"/></svg>
</a>
</li>
<?php } ?>
<?php if( isset( $instance['social-linkedin'] ) && $instance['social-linkedin'] ){ ?>
<li class="social-share-list list-group-item linkedin-svg">
<a target="_blank" href="<?php echo esc_url( $instance['social-linkedin'] );?>">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"/></svg>
</a>
</li>
<?php } ?>
<?php if( isset( $instance['social-twitter'] ) && $instance['social-twitter'] ){ ?>
<li class="social-share-list list-group-item twitter-svg">
<a target="_blank" href="<?php echo esc_url( $instance['social-twitter'] );?>">
<svg version="1.1" viewBox="0 0 512 512" width="512px" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M492,109.5c-17.4,7.7-36,12.9-55.6,15.3c20-12,35.4-31,42.6-53.6c-18.7,11.1-39.4,19.2-61.5,23.5 C399.8,75.8,374.6,64,346.8,64c-53.5,0-96.8,43.4-96.8,96.9c0,7.6,0.8,15,2.5,22.1C172,179,100.6,140.4,52.9,81.7 c-8.3,14.3-13.1,31-13.1,48.7c0,33.6,17.1,63.3,43.1,80.7C67,210.7,52,206.3,39,199c0,0.4,0,0.8,0,1.2c0,47,33.4,86.1,77.7,95 c-8.1,2.2-16.7,3.4-25.5,3.4c-6.2,0-12.3-0.6-18.2-1.8c12.3,38.5,48.1,66.5,90.5,67.3c-33.1,26-74.9,41.5-120.3,41.5 c-7.8,0-15.5-0.5-23.1-1.4C62.9,432,113.8,448,168.4,448C346.6,448,444,300.3,444,172.2c0-4.2-0.1-8.4-0.3-12.5 C462.6,146,479,128.9,492,109.5z"/></svg>
</a>
</li>
<?php } ?>
<?php if( isset( $instance['social-instagram'] ) && $instance['social-instagram'] ){ ?>
<li class="social-share-list list-group-item instagram-svg">
<a target="_blank" href="<?php echo esc_url( $instance['social-instagram'] );?>">
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-instagram" viewBox="0 0 16 16"> <path d="M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z"/> </svg>
</a>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
<?php
$html = ob_get_clean();
echo apply_filters( 'daisy_blog_widget_author_profile_widget_filter', $html, $args, $instance );
echo $args['after_widget'];
}
public function form( $instance ) {
$obj = new Graphthemes_Widget_Functions();
$email = get_option('admin_email');
$title = ! empty( $instance['title'] ) ? $instance['title'] : '';
$name = ! empty( $instance['name'] ) ? $instance['name'] : '';
$email = ! empty( $instance['email'] ) ? $instance['email'] : sanitize_email( $email );
$content = ! empty( $instance['content'] ) ? $instance['content'] : '';
$image = ! empty( $instance['image'] ) ? $instance['image'] : '';
$author_image = ! empty( $instance['author-image'] ) ? $instance['author-image'] : '';
$label = ! empty( $instance['label'] ) ? $instance['label'] : '';
$link = ! empty( $instance['link'] ) ? $instance['link'] : '';
$target = ! empty( $instance['target'] ) ? $instance['target'] : 0;
$socicon = ! empty( $instance['socicon'] ) ? $instance['socicon'] : '';
$option = ! empty( $instance['author-image-option'] ) ? $instance['author-image-option'] : 'gravatar';
$social_facebook = ! empty( $instance['social-facebook'] ) ? $instance['social-facebook'] : '';
$social_linkedin = ! empty( $instance['social-linkedin'] ) ? $instance['social-linkedin'] : '';
$social_twitter = ! empty( $instance['social-twitter'] ) ? $instance['social-twitter'] : '';
$social_instagram = ! empty( $instance['social-instagram'] ) ? $instance['social-instagram'] : '';
?>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'title' ) ); ?>" type="text" value="<?php echo esc_attr( $title ); ?>" />
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'name' ) ); ?>"><?php esc_html_e( 'Author Name', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'name' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'name' ) ); ?>" type="text" value="<?php echo esc_attr( $name ); ?>" />
</p>
<p>
<label><?php esc_html_e('Display photo from:','zeitfresser'); ?></label>
<input class="author-image" type="radio" name="<?php echo esc_attr( $this->get_field_name( 'author-image-option' ) );?>" id="<?php echo esc_attr( $this->get_field_id( 'author-image-option' . '-gravatar' ) );?>" value="gravatar" <?php if( $option == 'gravatar' ) echo 'checked'; ?> />
<label for="<?php echo esc_attr( $this->get_field_id( 'author-image-option' . '-gravatar' ) );?>" class="radio-btn-wrap"><?php esc_html_e('Gravatar', 'zeitfresser');?></label>
<input class="author-image" type="radio" name="<?php echo esc_attr( $this->get_field_name( 'author-image-option' ) );?>" id="<?php echo esc_attr( $this->get_field_id( 'author-image-option' . '-photo' ) );?>" value="photo" <?php if( $option == 'photo' ) echo 'checked'; ?> />
<label for="<?php echo esc_attr( $this->get_field_id( 'author-image-option' . '-photo' ) );?>" class="radio-btn-wrap"><?php esc_html_e('Uploaded Photo','zeitfresser');?></label>
</p>
<p>
<input class="widefat author_image_url" id="<?php echo $this->get_field_id( 'author-image' ); ?>" name="<?php echo $this->get_field_name( 'author-image' ); ?>" type="text" value="<?php echo esc_url( $author_image ); ?>" />
<button class="upload_image_button button button-primary"><?php esc_html_e( "Select Image", 'zeitfresser' ); ?></button>
</p>
<p class="author-email">
<label for="<?php echo esc_attr( $this->get_field_id( 'email' ) ); ?>"><?php esc_html_e( 'Author Email', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'email' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'email' ) ); ?>" type="text" value="<?php echo esc_attr( $email ); ?>" />
</p>
<div class="widget-side-note" class="example-text"><?php $grav_link = '<a href=' . esc_url( get_avatar_url( $email ) ) . ' target="_blank">' . esc_html__( "Gravatar", 'zeitfresser' ) . '</a>'; echo sprintf( __( 'You can show your %1$s image instead of manually uploading your photo. Just add your gravatar registered email address here.','zeitfresser'), $grav_link );?></div>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'content' ) ); ?>"><?php esc_html_e( 'Description', 'zeitfresser' ); ?></label>
<textarea name="<?php echo esc_attr( $this->get_field_name( 'content' ) ); ?>" class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'content' ) ); ?>"><?php echo wp_kses_post( $content ); ?></textarea>
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'label' ) ); ?>"><?php esc_html_e( 'Button Label', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'label' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'label' ) ); ?>" type="text" value="<?php echo esc_attr( $label ); ?>" />
</p>
<p>
<label for="<?php echo esc_attr( $this->get_field_id( 'link' ) ); ?>"><?php esc_html_e( 'Button Link', 'zeitfresser' ); ?></label>
<input id="<?php echo esc_attr( $this->get_field_id( 'link' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'link' ) ); ?>" type="text" value="<?php echo esc_url( $link ); ?>" />
</p>
<p>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'target' ) ); ?>" <?php $j='0'; if( isset( $instance['target'] ) ){ $j='1'; } ?> value="1" <?php checked( $j, true ); ?> name="<?php echo esc_attr( $this->get_field_name( 'target' ) ); ?>" type="checkbox" />
<label for="<?php echo esc_attr( $this->get_field_id( 'target' ) ); ?>"><?php esc_html_e( 'Open in New Tab', 'zeitfresser' ); ?></label>
</p>
<div class="widget-social-profile">
<label><h3><?php esc_html_e( "Social Profile", 'zeitfresser' ); ?></h3></label>
<label for="<?php echo esc_attr( $this->get_field_id( 'social-facebook' ) ); ?>"><?php esc_html_e( 'Facebook Profile', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'social-facebook' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'social-facebook' ) ); ?>" type="text" value="<?php echo esc_attr( $social_facebook ); ?>" />
<label for="<?php echo esc_attr( $this->get_field_id( 'social-linkedin' ) ); ?>"><?php esc_html_e( 'LinkedIn Profile', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'social-linkedin' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'social-linkedin' ) ); ?>" type="text" value="<?php echo esc_attr( $social_linkedin ); ?>" />
<label for="<?php echo esc_attr( $this->get_field_id( 'social-twitter' ) ); ?>"><?php esc_html_e( 'Twitter Profile', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'social-twitter' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'social-twitter' ) ); ?>" type="text" value="<?php echo esc_attr( $social_twitter ); ?>" />
<label for="<?php echo esc_attr( $this->get_field_id( 'social-instagram' ) ); ?>"><?php esc_html_e( 'Instagram Profile', 'zeitfresser' ); ?></label>
<input class="widefat" id="<?php echo esc_attr( $this->get_field_id( 'social-instagram' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'social-instagram' ) ); ?>" type="text" value="<?php echo esc_attr( $social_instagram ); ?>" />
</div>
<?php
}
/**
* Sanitize widget form values as they are saved.
*
* @see WP_Widget::update()
*
* @param array $new_instance Values just sent to be saved.
* @param array $old_instance Previously saved values from database.
*
* @return array Updated safe values to be saved.
*/
public function update( $new_instance, $old_instance ) {
$instance = array();
$email = get_option('admin_email');
$instance['title'] = ! empty( $new_instance['title'] ) ? sanitize_text_field( $new_instance['title'] ) : "";
$instance['name'] = ! empty( $new_instance['name'] ) ? sanitize_text_field( $new_instance['name'] ) : "" ;
$instance['email'] = ! empty( $new_instance['email'] ) ? sanitize_email( $new_instance['email'] ) : $email;
$instance['content'] = ! empty( $new_instance['content'] ) ? wp_kses_post( $new_instance['content'] ) : '';
$instance['image'] = ! empty( $new_instance['image'] ) ? esc_url( $new_instance['image'] ) : '';
$instance['author-image'] = ! empty( $new_instance['author-image'] ) ? esc_url( $new_instance['author-image'] ) : '';
$instance['label'] = ! empty( $new_instance['label'] ) ? wp_kses_post( $new_instance['label'] ) : '';
$instance['link'] = ! empty( $new_instance['link'] ) ? esc_url( $new_instance['link'] ) : '';
$instance['target'] = ! empty( $new_instance['target'] ) ? absint( $new_instance['target'] ) : 0;
$instance['socicon'] = ! empty( $new_instance['socicon'] ) ? wp_kses_post( $new_instance['socicon'] ) : '';
$instance['author-image-option'] = ! empty( $new_instance['author-image-option'] ) ? wp_kses_post( $new_instance['author-image-option'] ) : '';
$instance['social-facebook'] = ! empty( $new_instance['social-facebook'] ) ? esc_url( $new_instance['social-facebook'] ) : '';
$instance['social-linkedin'] = ! empty( $new_instance['social-linkedin'] ) ? esc_url( $new_instance['social-linkedin'] ) : '';
$instance['social-twitter'] = ! empty( $new_instance['social-twitter'] ) ? esc_url( $new_instance['social-twitter'] ) : '';
$instance['social-instagram'] = ! empty( $new_instance['social-instagram'] ) ? wp_kses_post( $new_instance['social-instagram'] ) : '';
return $instance;
}
}
endif;

Some files were not shown because too many files have changed in this diff Show More