oont-contents/plugins/jetpack-boost/app/lib/Cornerstone_Pages.php
2025-02-08 15:10:23 +01:00

154 lines
4.4 KiB
PHP

<?php
namespace Automattic\Jetpack_Boost\Lib;
use Automattic\Jetpack\Schema\Schema;
use Automattic\Jetpack_Boost\Contracts\Has_Setup;
use Automattic\Jetpack_Boost\Data_Sync\Cornerstone_Pages_Entry;
class Cornerstone_Pages implements Has_Setup {
const PREMIUM_MAX_PAGES = 10;
const FREE_MAX_PAGES = 1;
public function setup() {
$this->register_ds_stores();
add_filter( 'jetpack_boost_critical_css_providers', array( $this, 'remove_ccss_front_page_provider' ), 10, 2 );
add_filter( 'display_post_states', array( $this, 'add_display_post_states' ), 10, 2 );
add_action( 'init', array( $this, 'set_default_pages' ), 0 );
}
public function set_default_pages() {
$pages = jetpack_boost_ds_get( 'cornerstone_pages_list' );
if ( empty( $pages ) ) {
jetpack_boost_ds_set( 'cornerstone_pages_list', $this->default_pages() );
}
}
private function register_ds_stores() {
$schema = Schema::as_array( Schema::as_string() )->fallback( array() );
jetpack_boost_register_option( 'cornerstone_pages_list', $schema, new Cornerstone_Pages_Entry( 'cornerstone_pages_list' ) );
jetpack_boost_register_readonly_option( 'cornerstone_pages_properties', array( $this, 'get_properties' ) );
}
public function remove_ccss_front_page_provider( $providers ) {
$filtered_providers = array();
foreach ( $providers as $provider ) {
if ( $provider['key'] !== 'core_front_page' ) {
$filtered_providers[] = $provider;
}
}
return $filtered_providers;
}
private function default_pages() {
if ( $this->get_max_pages() === static::FREE_MAX_PAGES ) {
return array( '' );
}
$max_pages = $this->get_max_pages();
$yoast_cornerstone_pages = $this->get_yoast_cornerstone_pages();
$woocommerce_pages = $this->get_woocommerce_pages();
$homepage = array( '' );
$urls = array_unique( array_merge( $homepage, $woocommerce_pages, $yoast_cornerstone_pages ) );
$urls = array_map( 'untrailingslashit', $urls );
return array_slice( $urls, 0, $max_pages );
}
private function get_yoast_cornerstone_pages() {
$max_pages = $this->get_max_pages();
$yoast_cornerstone_content = get_posts(
array(
'meta_key' => '_yoast_wpseo_is_cornerstone',
'meta_value' => '1',
'post_type' => 'any',
'posts_per_page' => $max_pages,
)
);
$urls = array();
foreach ( $yoast_cornerstone_content as $post ) {
$permalink = get_permalink( $post->ID );
if ( $permalink ) {
$relative_permalink = $this->make_relative_url( $permalink );
$urls[] = $relative_permalink;
}
}
return $urls;
}
private function get_woocommerce_pages() {
$urls = array();
if ( ! function_exists( 'wc_get_page_id' ) ) {
return $urls;
}
$shop_page_id = \wc_get_page_id( 'shop' );
if ( $shop_page_id ) {
$url = get_permalink( $shop_page_id );
if ( $url ) {
$relative_url = $this->make_relative_url( $url );
if ( $relative_url ) {
$urls[] = $relative_url;
}
}
}
return $urls;
}
private function make_relative_url( $url ) {
if ( is_string( $url ) && strpos( $url, home_url() ) === 0 ) {
$url = substr( $url, strlen( home_url() ) );
}
return $url;
}
public function get_pages() {
$pages = jetpack_boost_ds_get( 'cornerstone_pages_list' );
$permalink_structure = get_option( 'permalink_structure' );
// If permalink structure ends with slash, add trailing slashes
if ( $permalink_structure && substr( $permalink_structure, -1 ) === '/' ) {
$pages = array_map( 'trailingslashit', $pages );
}
return $pages;
}
public function get_properties() {
return array(
'max_pages' => $this->get_max_pages(),
'max_pages_premium' => static::PREMIUM_MAX_PAGES,
'default_pages' => array_map( 'home_url', $this->default_pages() ),
);
}
public function add_display_post_states( $post_states, $post ) {
$cornerstone_pages = $this->get_pages();
if ( ! empty( $cornerstone_pages ) ) {
$post_url = untrailingslashit( get_permalink( $post ) );
$cornerstone_pages = array_map( 'untrailingslashit', $cornerstone_pages );
if ( in_array( $post_url, $cornerstone_pages, true ) ) {
$post_states[] = __( 'Cornerstone Page', 'jetpack-boost' );
}
}
return $post_states;
}
private function get_max_pages() {
return Premium_Features::has_feature( Premium_Features::CORNERSTONE_TEN_PAGES ) ? static::PREMIUM_MAX_PAGES : static::FREE_MAX_PAGES;
}
}