oont-contents/plugins/wp-rocket/inc/Engine/CriticalPath/Admin/Post.php
2025-02-08 15:10:23 +01:00

244 lines
5.6 KiB
PHP

<?php
namespace WP_Rocket\Engine\CriticalPath\Admin;
use WP_Rocket\Abstract_Render;
use WP_Rocket\Admin\Options_Data;
use WP_Rocket\Engine\Admin\Beacon\Beacon;
class Post extends Abstract_Render {
/**
* Instance of the Beacon handler.
*
* @var Beacon
*/
private $beacon;
/**
* Instance of options handler.
*
* @var Options_Data
*/
private $options;
/**
* Path to the critical-css directory.
*
* @var string
*/
private $critical_css_path;
/**
* Array of reasons to disable actions.
*
* @var array
*/
private $disabled_data;
/**
* Creates an instance of the subscriber.
*
* @param Options_Data $options WP Rocket Options instance.
* @param Beacon $beacon Beacon instance.
* @param string $critical_path Path to the critical CSS base folder.
* @param string $template_path Path to the templates folder.
*/
public function __construct( Options_Data $options, Beacon $beacon, $critical_path, $template_path ) {
parent::__construct( $template_path );
$this->beacon = $beacon;
$this->options = $options;
$this->critical_css_path = $critical_path . get_current_blog_id() . '/posts/';
}
/**
* Displays the critical CSS block in WP Rocket options metabox.
*
* @since 3.6
*
* @return void
*/
public function cpcss_section() {
if ( ! current_user_can( 'rocket_manage_options' ) ) {
return;
}
$data = [
'disabled_description' => $this->get_disabled_description(),
];
echo $this->generate( 'metabox/container', $data ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Displays the content inside the critical CSS block.
*
* @since 3.6
*
* @return void
*/
public function cpcss_actions() {
if ( ! current_user_can( 'rocket_manage_options' ) ) {
return;
}
$data = [
'disabled' => $this->is_enabled(),
'beacon' => $this->beacon->get_suggest( 'async' ),
'cpcss_exists' => $this->cpcss_exists(),
];
// phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
echo $this->generate(
'metabox/generate',
$data // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
);
}
/**
* Enqueue CPCSS generation / deletion script on edit.php page.
*
* @since 3.6
*
* @param string $page The current admin page.
*
* @return void
*/
public function enqueue_admin_edit_script( $page ) {
global $post, $pagenow;
if ( ! current_user_can( 'rocket_manage_options' ) ) {
return;
}
// Bailout if the page is not Post / Page.
if ( ! in_array( $page, [ 'edit.php', 'post.php' ], true ) ) {
return;
}
if ( ! in_array( $pagenow, [ 'post-new.php', 'post.php' ], true ) ) {
return;
}
// Bailout if the CPCSS is not enabled for this Post / Page.
if ( $this->is_enabled() ) {
return;
}
$post_id = ( 'post-new.php' === $pagenow ) ? '' : $post->ID;
wp_enqueue_script(
'wpr-edit-cpcss-script',
rocket_get_constant( 'WP_ROCKET_ASSETS_JS_URL' ) . 'wpr-cpcss.js',
[],
rocket_get_constant( 'WP_ROCKET_VERSION' ),
true
);
wp_localize_script(
'wpr-edit-cpcss-script',
'rocket_cpcss',
[
'rest_url' => rest_url( "wp-rocket/v1/cpcss/post/{$post_id}" ),
'rest_nonce' => wp_create_nonce( 'wp_rest' ),
'generate_btn' => __( 'Generate Specific CPCSS', 'rocket' ),
'regenerate_btn' => __( 'Regenerate specific CPCSS', 'rocket' ),
'wprMobileCpcssEnabled' => $this->options->get( 'async_css_mobile', 0 ),
]
);
}
/**
* Gets data for the disabled checks.
*
* @since 3.6
*
* @return array
*/
private function get_disabled_data() {
global $post;
if ( rocket_get_constant( 'WP_ROCKET_IS_TESTING', false ) ) {
$this->disabled_data = null;
}
if ( isset( $this->disabled_data ) ) {
return $this->disabled_data;
}
if ( 'publish' !== $post->post_status ) {
$this->disabled_data['not_published'] = 1;
}
if ( ! $this->options->get( 'async_css', 0 ) ) {
$this->disabled_data['option_disabled'] = 1;
}
if ( get_post_meta( $post->ID, '_rocket_exclude_async_css', true ) ) {
$this->disabled_data['option_excluded'] = 1;
}
if ( ! is_post_type_viewable( get_post_type( $post ) ) ) {
$this->disabled_data['not_viewable'] = 1;
}
return $this->disabled_data;
}
/**
* Checks if critical CSS generation is enabled for the current post.
*
* @since 3.6
*
* @return bool
*/
private function is_enabled() {
return ! empty( $this->get_disabled_data() );
}
/**
* Returns the reason why actions are disabled.
*
* @since 3.6
*
* @return string
*/
private function get_disabled_description() {
global $post;
$disabled_data = $this->get_disabled_data();
if ( empty( $disabled_data ) ) {
return '';
}
if ( isset( $disabled_data['not_viewable'] ) ) {
return __( 'This feature is not available for non-public post types.', 'rocket' );
}
$notice = __( '%l to use this feature.', 'rocket' );
$list = [
// translators: %s = post type.
'not_published' => sprintf( __( 'Publish the %s', 'rocket' ), $post->post_type ),
'option_disabled' => __( 'Enable Load CSS asynchronously in WP Rocket settings', 'rocket' ),
'option_excluded' => __( 'Enable Load CSS asynchronously in the options above', 'rocket' ),
];
return wp_sprintf_l( $notice, array_intersect_key( $list, $disabled_data ) );
}
/**
* Checks if a specific critical css file exists for the current post.
*
* @since 3.6
*
* @return bool
*/
private function cpcss_exists() {
global $post;
$post_cpcss = "{$this->critical_css_path}{$post->post_type}-{$post->ID}.css";
return rocket_direct_filesystem()->exists( $post_cpcss );
}
}