diff options
Diffstat (limited to 'plugins/jetpack/modules/related-posts/class.related-posts-customize.php')
-rw-r--r-- | plugins/jetpack/modules/related-posts/class.related-posts-customize.php | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/related-posts/class.related-posts-customize.php b/plugins/jetpack/modules/related-posts/class.related-posts-customize.php new file mode 100644 index 00000000..8f15ca69 --- /dev/null +++ b/plugins/jetpack/modules/related-posts/class.related-posts-customize.php @@ -0,0 +1,300 @@ +<?php + +// Exit if file is accessed directly +if ( ! defined( 'ABSPATH' ) ) { + exit; +} + +/** + * Class to include elements to modify Related Posts look in Customizer. + * + * @since 4.4.0 + */ +class Jetpack_Related_Posts_Customize { + + /** + * Key for panel, section and prefix for options. Same option name than in Options > Reading. + * + * @var string + */ + var $prefix = 'jetpack_relatedposts'; + + /** + * @var string Control to focus when customizer loads. + */ + var $focus = ''; + + /** + * Class initialization. + * + * @since 4.4.0 + */ + function __construct() { + add_action( 'customize_register', array( $this, 'customize_register' ) ); + add_action( 'customize_controls_enqueue_scripts', array( $this, 'customize_controls_enqueue_scripts' ) ); + } + + /** + * Initialize Customizer controls. + * + * @since 4.4.0 + * + * @param WP_Customize_Manager $wp_customize Customizer instance. + */ + function customize_register( $wp_customize ) { + + $wp_customize->add_section( $this->prefix, + array( + 'title' => esc_html__( 'Related Posts', 'jetpack' ), + 'description' => '', + 'capability' => 'edit_theme_options', + 'priority' => 200, + ) + ); + + $selective_options = array(); + + foreach ( $this->get_options( $wp_customize ) as $key => $field ) { + $control_id = "$this->prefix[$key]"; + $selective_options[] = $control_id; + $wp_customize->add_setting( $control_id, + array( + 'default' => isset( $field['default'] ) ? $field['default'] : '', + 'type' => isset( $field['setting_type'] ) ? $field['setting_type'] : 'option', + 'capability' => isset( $field['capability'] ) ? $field['capability'] : 'edit_theme_options', + 'transport' => isset( $field['transport'] ) ? $field['transport'] : 'postMessage', + ) + ); + $control_settings = array( + 'label' => isset( $field['label'] ) ? $field['label'] : '', + 'description' => isset( $field['description'] ) ? $field['description'] : '', + 'settings' => $control_id, + 'type' => isset( $field['control_type'] ) ? $field['control_type'] : 'text', + 'section' => $this->prefix, + 'priority' => 10, + 'active_callback' => isset( $field['active_callback'] ) ? $field['active_callback'] : __CLASS__ . '::is_single', + ); + switch ( $field['control_type'] ) { + case 'text': + case 'checkbox': + default: + $wp_customize->add_control( new WP_Customize_Control( $wp_customize, $control_id, $control_settings ) ); + break; + case 'select': + if ( isset( $field['choices'] ) ) { + $control_settings['choices'] = $field['choices']; + $wp_customize->add_control( new WP_Customize_Control( $wp_customize, $control_id, $control_settings ) ); + } + break; + case 'message': + $wp_customize->add_control( new Jetpack_Message_Control( $wp_customize, $control_id, $control_settings ) ); + break; + } + } + + // If selective refresh is available, implement it. + if ( isset( $wp_customize->selective_refresh ) ) { + $wp_customize->selective_refresh->add_partial( "$this->prefix", array( + 'selector' => '.jp-relatedposts:not(.jp-relatedposts-block)', + 'settings' => $selective_options, + 'render_callback' => __CLASS__ . '::render_callback', + 'container_inclusive' => false, + ) ); + } + + } + + /** + * Callback that outputs the headline based on user choice. + * + * @since 4.4.0 + */ + public static function render_callback() { + echo Jetpack_RelatedPosts::init()->get_headline(); + } + + /** + * Check whether the current post contains a Related Posts block. + * + * @since 6.9.0 + * + * @return bool + */ + public static function contains_related_posts_block() { + if ( has_block( 'jetpack/related-posts' ) ) { + return true; + } + + return false; + } + + /** + * Check that we're in a single post view. + * Will return `false` if the current post contains a Related Posts block, + * because in that case we want to hide the Customizer controls. + * + * @since 4.4.0 + * + * @return bool + */ + public static function is_single() { + if ( self::contains_related_posts_block() ) { + return false; + } + return is_single(); + } + + /** + * Check that we're not in a single post view. + * Will return `false` if the current post contains a Related Posts block, + * because in that case we want to hide the Customizer controls. + * + * @since 4.4.0 + * + * @return bool + */ + public static function is_not_single() { + if ( self::contains_related_posts_block() ) { + return false; + } + return ! is_single(); + } + + /** + * Return list of options to modify. + * + * @since 4.4.0 + * + * @param object $wp_customize Instance of WP Customizer + * + * @return mixed|void + */ + function get_options( $wp_customize ) { + $transport = isset( $wp_customize->selective_refresh ) ? 'postMessage' : 'refresh'; + + $switched_locale = switch_to_locale( get_user_locale() ); + $headline = __( 'Related', 'jetpack' ); + if ( $switched_locale ) { + restore_previous_locale(); + } + + /** + * The filter allows you to change the options used to display Related Posts in the Customizer. + * + * @module related-posts + * + * @since 4.4.0 + * + * @param array $options Array of options used to display Related Posts in the Customizer. + */ + return apply_filters( + 'jetpack_related_posts_customize_options', array( + 'enabled' => array( + 'control_type' => 'hidden', + 'default' => 1, + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'show_headline' => array( + 'label' => esc_html__( 'Show a headline', 'jetpack' ), + 'description' => esc_html__( 'This helps to clearly separate the related posts from post content.', 'jetpack' ), + 'control_type' => 'checkbox', + 'default' => 1, + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'headline' => array( + 'label' => '', + 'description' => esc_html__( 'Enter text to use as headline.', 'jetpack' ), + 'control_type' => 'text', + 'default' => esc_html( $headline ), + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'show_thumbnails' => array( + 'label' => esc_html__( 'Show thumbnails', 'jetpack' ), + 'description' => esc_html__( 'Show a thumbnail image where available.', 'jetpack' ), + 'control_type' => 'checkbox', + 'default' => 1, + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'show_date' => array( + 'label' => esc_html__( 'Show date', 'jetpack' ), + 'description' => esc_html__( 'Display date when entry was published.', 'jetpack' ), + 'control_type' => 'checkbox', + 'default' => 1, + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'show_context' => array( + 'label' => esc_html__( 'Show context', 'jetpack' ), + 'description' => esc_html__( "Display entry's category or tag.", 'jetpack' ), + 'control_type' => 'checkbox', + 'default' => 1, + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'layout' => array( + 'label' => esc_html__( 'Layout', 'jetpack' ), + 'description' => esc_html__( 'Arrange entries in different layouts.', 'jetpack' ), + 'control_type' => 'select', + 'choices' => array( + 'grid' => esc_html__( 'Grid', 'jetpack' ), + 'list' => esc_html__( 'List', 'jetpack' ), + ), + 'default' => 'grid', + 'setting_type' => 'option', + 'transport' => $transport, + ), + 'msg_go_to_single' => array( + 'description' => esc_html__( 'Please visit a single post view to reveal the customization options.', 'jetpack' ), + 'control_type' => 'message', + 'active_callback' => __CLASS__ . '::is_not_single', + ), + 'msg_example' => array( + 'description' => esc_html__( 'Please note that the related posts displayed now are only for previewing purposes.', 'jetpack' ), + 'control_type' => 'message', + ), + ) + ); + } + + /** + * Enqueue assets for Customizer controls. + * + * @since 4.4.0 + */ + function customize_controls_enqueue_scripts() { + wp_enqueue_script( + 'jetpack_related-posts-customizer', + Jetpack::get_file_url_for_environment( + '_inc/build/related-posts/related-posts-customizer.min.js', + 'modules/related-posts/related-posts-customizer.js' + ), + array( 'customize-controls' ), + JETPACK__VERSION + ); + } + +} // class end + +/** + * Control that displays a message in Customizer. + * + * @since 4.4.0 + */ +class Jetpack_Message_Control extends WP_Customize_Control { + + /** + * Render the message. + * + * @since 4.4.0 + */ + public function render_content() { + echo '<p class="description">' . esc_html( $this->description ) . '</p>'; + } +} // class end + +// Initialize controls +new Jetpack_Related_Posts_Customize; |