custom-modern-theme/setup.php

240 lines
5.4 KiB
PHP
Raw Permalink Normal View History

2024-07-31 20:14:58 +02:00
<?php
/**
* Child theme setup.
*
* @copyright WebMan Design, Oliver Juhas
*/
namespace WebManDesign\Child_Theme;
use WP_Query;
// Exit if accessed directly.
defined( 'ABSPATH' ) || exit;
class Setup {
/**
* Stylesheet modification time cache.
*
* @access public
* @var string
*/
public static $stylesheet_filemtime = '';
/**
* Initialization.
*
* @return void
*/
public static function init() {
// Processing
self::$stylesheet_filemtime = filemtime( get_theme_file_path( 'style.css' ) );
add_action( 'wp_enqueue_scripts', __CLASS__ . '::assets' );
add_action( 'after_switch_theme', __CLASS__ . '::parent_options' );
add_filter( 'pre_render_block', __CLASS__ . '::block', 0, 2 );
add_filter( 'render_block', __CLASS__ . '::block', 0, 2 );
} // /init
/**
* Enqueue parent theme stylesheet.
*
* This runs only if parent theme does not claim support for
* `child-theme-stylesheet`, and so we need to enqueue this
* child theme's `style.css` file ourselves.
*
* If parent theme supports `child-theme-stylesheet`, it enqueues
* this child theme's `style.css` file automatically.
*
* @return void
*/
public static function assets() {
// Requirements check
if ( current_theme_supports( 'child-theme-stylesheet' ) ) {
return;
}
// Processing
// Enqueue parent theme stylesheet.
wp_enqueue_style(
'parent-theme-style',
get_template_directory_uri() . '/style.css',
array(),
wp_get_theme( get_template() )->get( 'Version' )
);
// Then enqueue the child theme stylesheet.
wp_enqueue_style(
'child-theme-style',
get_stylesheet_uri(),
array(),
filemtime( get_theme_file_path( 'style.css' ) )
);
} // /assets
/**
* Copy parent theme options.
*
* @return void
*/
public static function parent_options() {
// Variables
$child_theme = get_stylesheet();
$parent_theme = get_template();
// Processing
/**
* Copy theme mods.
*
* WordPress sets default theme mods when a theme is switched.
* It looks like it creates max 4 mod keys during the action.
* So, anything above, we presume child theme mods already
* exist and we don't proceed with copying.
*
* @link https://developer.wordpress.org/reference/functions/switch_theme/
*/
if (
// Check for existing child theme mods:
4 >= count( (array) get_theme_mods() )
// Check for WebMan Design child theme mods:
&& ! get_theme_mod( '__customize_timestamp' )
// Check for this child theme mods (see below):
&& ! get_theme_mod( '__switch_theme_timestamp' )
) {
// Get parent theme mods.
$parent_theme_mods = get_option( 'theme_mods_' . $parent_theme );
// Copy parent theme options to our child theme ones.
update_option( 'theme_mods_' . $child_theme, $parent_theme_mods );
// Mark as done for the future.
set_theme_mod( '__switch_theme_timestamp', esc_attr( gmdate( 'ymdHis' ) ) );
}
/**
* Copy Site Editor user mods.
*
* Relevant for block or hybrid themes.
*/
if ( false === get_theme_mod( '__site_editor_mods_copy_timestamp' ) ) {
$query = new WP_Query( array(
'post_status' => array( 'publish' ),
'post_type' => array( 'wp_template', 'wp_template_part', 'wp_global_styles' ),
'posts_per_page' => -1,
'no_found_rows' => true,
'tax_query' => array(
array(
'taxonomy' => 'wp_theme',
'field' => 'name',
'terms' => $parent_theme,
),
),
) );
foreach ( $query->posts as $post ) {
$wp_theme = wp_get_object_terms( $post->ID, 'wp_theme', array( 'fields' => 'slugs' ) );
if (
! empty( $wp_theme )
&& ! is_wp_error( $wp_theme )
&& in_array( $parent_theme, (array) $wp_theme )
) {
// Add the child theme to `wp_theme` taxonomy terms.
$wp_theme = (array) $wp_theme;
$wp_theme[] = $child_theme;
wp_set_object_terms(
$post->ID,
$wp_theme,
'wp_theme'
);
}
}
// Mark as done for the future.
set_theme_mod( '__site_editor_mods_copy_timestamp', esc_attr( gmdate( 'ymdHis' ) ) );
}
} // /parent_options
/**
* Make a (Template Part) block work if it has `theme` attribute set.
*
* @param mixed $render
* @param array $block
*
* @return mixed
*/
public static function block( $render, array $block ) {
// Requirements check
if (
! isset( $block['attrs']['theme'] )
|| get_stylesheet() === $block['attrs']['theme']
) {
return $render;
}
// Processing
if ( doing_filter( 'pre_render_block' ) ) {
add_filter( 'stylesheet', __CLASS__ . '::set_stylesheet_parent' );
} else {
remove_filter( 'stylesheet', __CLASS__ . '::set_stylesheet_parent' );
}
// Output
return $render;
} // /block
/**
* Change stylesheet to template.
*
* @param string $stylesheet
*
* @return string
*/
public static function set_stylesheet_parent( string $stylesheet ): string {
// Requirements check
// Make sure we don't screw up the assets enqueuing.
if ( doing_action( 'wp_enqueue_scripts' ) ) {
return $stylesheet;
}
// Output
return (string) get_template();
} // /set_stylesheet_parent
}
Setup::init();