mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-05-23 12:44:30 +00:00
General: add block theme previews.
Adds a preview link to block themes in the themes screen, opening the previews in the site editor. Props onemaggie, andraganescu, audrasjb, flixos90, peterwilsoncc, spacedmonkey, scruffian. Fixes #58561. git-svn-id: https://develop.svn.wordpress.org/trunk@56059 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -168,3 +168,10 @@ add_action( 'post_updated', array( 'WP_Privacy_Policy_Content', '_policy_page_up
|
||||
|
||||
// Append '(Draft)' to draft page titles in the privacy page dropdown.
|
||||
add_filter( 'list_pages', '_wp_privacy_settings_filter_draft_page_titles', 10, 2 );
|
||||
|
||||
// Attaches filters to enable theme previews in the Site Editor.
|
||||
if ( ! empty( $_GET['wp_theme_preview'] ) ) {
|
||||
add_filter( 'stylesheet', 'wp_get_theme_preview_path' );
|
||||
add_filter( 'template', 'wp_get_theme_preview_path' );
|
||||
add_action( 'init', 'wp_attach_theme_preview_middleware' );
|
||||
}
|
||||
|
||||
@@ -71,6 +71,7 @@ require_once ABSPATH . 'wp-admin/includes/list-table.php';
|
||||
|
||||
/** WordPress Theme Administration API */
|
||||
require_once ABSPATH . 'wp-admin/includes/theme.php';
|
||||
require_once ABSPATH . 'wp-admin/includes/theme-previews.php';
|
||||
|
||||
/** WordPress Privacy Functions */
|
||||
require_once ABSPATH . 'wp-admin/includes/privacy-tools.php';
|
||||
|
||||
56
src/wp-admin/includes/theme-previews.php
Normal file
56
src/wp-admin/includes/theme-previews.php
Normal file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/**
|
||||
* Theme previews using the Site Editor for block themes.
|
||||
*
|
||||
* @package WordPress
|
||||
*/
|
||||
|
||||
/**
|
||||
* Filters the blog option to return the path for the previewed theme.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*
|
||||
* @param string $current_stylesheet The current theme's stylesheet or template path.
|
||||
* @return string The previewed theme's stylesheet or template path.
|
||||
*/
|
||||
function wp_get_theme_preview_path( $current_stylesheet = null ) {
|
||||
if ( ! current_user_can( 'switch_themes' ) ) {
|
||||
return $current_stylesheet;
|
||||
}
|
||||
|
||||
$preview_stylesheet = ! empty( $_GET['wp_theme_preview'] ) ? sanitize_text_field( wp_unslash( $_GET['wp_theme_preview'] ) ) : null;
|
||||
$wp_theme = wp_get_theme( $preview_stylesheet );
|
||||
if ( ! is_wp_error( $wp_theme->errors() ) ) {
|
||||
if ( current_filter() === 'template' ) {
|
||||
$theme_path = $wp_theme->get_template();
|
||||
} else {
|
||||
$theme_path = $wp_theme->get_stylesheet();
|
||||
}
|
||||
|
||||
return sanitize_text_field( $theme_path );
|
||||
}
|
||||
|
||||
return $current_stylesheet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a middleware to `apiFetch` to set the theme for the preview.
|
||||
* This adds a `wp_theme_preview` URL parameter to API requests from the Site Editor, so they also respond as if the theme is set to the value of the parameter.
|
||||
*
|
||||
* @since 6.3.0
|
||||
*/
|
||||
function wp_attach_theme_preview_middleware() {
|
||||
// Don't allow non-admins to preview themes.
|
||||
if ( ! current_user_can( 'switch_themes' ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
wp_add_inline_script(
|
||||
'wp-api-fetch',
|
||||
sprintf(
|
||||
'wp.apiFetch.use( wp.apiFetch.createThemePreviewMiddleware( %s ) );',
|
||||
wp_json_encode( sanitize_text_field( wp_unslash( $_GET['wp_theme_preview'] ) ) )
|
||||
),
|
||||
'after'
|
||||
);
|
||||
}
|
||||
@@ -711,16 +711,21 @@ function wp_prepare_themes_for_js( $themes = null ) {
|
||||
$is_block_theme = $theme->is_block_theme();
|
||||
|
||||
if ( $is_block_theme && $can_edit_theme_options ) {
|
||||
$customize_action = esc_url( admin_url( 'site-editor.php' ) );
|
||||
$customize_action = admin_url( 'site-editor.php' );
|
||||
if ( $current_theme !== $slug ) {
|
||||
$customize_action = add_query_arg( 'wp_theme_preview', $slug, $customize_action );
|
||||
}
|
||||
} elseif ( ! $is_block_theme && $can_customize && $can_edit_theme_options ) {
|
||||
$customize_action = esc_url(
|
||||
add_query_arg(
|
||||
array(
|
||||
'return' => urlencode( sanitize_url( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ),
|
||||
),
|
||||
wp_customize_url( $slug )
|
||||
)
|
||||
$customize_action = wp_customize_url( $slug );
|
||||
}
|
||||
if ( null !== $customize_action ) {
|
||||
$customize_action = add_query_arg(
|
||||
array(
|
||||
'return' => urlencode( sanitize_url( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ),
|
||||
),
|
||||
$customize_action
|
||||
);
|
||||
$customize_action = esc_url( $customize_action );
|
||||
}
|
||||
|
||||
$update_requires_wp = isset( $updates[ $slug ]['requires'] ) ? $updates[ $slug ]['requires'] : null;
|
||||
|
||||
Reference in New Issue
Block a user