diff options
Diffstat (limited to 'plugins/jetpack/modules/custom-post-types/testimonial.php')
-rw-r--r-- | plugins/jetpack/modules/custom-post-types/testimonial.php | 763 |
1 files changed, 763 insertions, 0 deletions
diff --git a/plugins/jetpack/modules/custom-post-types/testimonial.php b/plugins/jetpack/modules/custom-post-types/testimonial.php new file mode 100644 index 00000000..ba427244 --- /dev/null +++ b/plugins/jetpack/modules/custom-post-types/testimonial.php @@ -0,0 +1,763 @@ +<?php + +class Jetpack_Testimonial { + const CUSTOM_POST_TYPE = 'jetpack-testimonial'; + const OPTION_NAME = 'jetpack_testimonial'; + const OPTION_READING_SETTING = 'jetpack_testimonial_posts_per_page'; + + public $version = '0.1'; + + static function init() { + static $instance = false; + + if ( ! $instance ) { + $instance = new Jetpack_Testimonial; + } + + return $instance; + } + + /** + * Conditionally hook into WordPress. + * + * Setup user option for enabling CPT. + * If user has CPT enabled, show in admin. + */ + function __construct() { + // Make sure the post types are loaded for imports + add_action( 'import_start', array( $this, 'register_post_types' ) ); + + // If called via REST API, we need to register later in lifecycle + add_action( 'restapi_theme_init', array( $this, 'maybe_register_cpt' ) ); + + // Add to REST API post type whitelist + add_filter( 'rest_api_allowed_post_types', array( $this, 'allow_cpt_rest_api_type' ) ); + + $this->maybe_register_cpt(); + } + + /** + * Registers the custom post types and adds action/filter handlers, but + * only if the site supports it + */ + function maybe_register_cpt() { + // Add an option to enable the CPT + add_action( 'admin_init', array( $this, 'settings_api_init' ) ); + + // Check on theme switch if theme supports CPT and setting is disabled + add_action( 'after_switch_theme', array( $this, 'activation_post_type_support' ) ); + + $setting = Jetpack_Options::get_option_and_ensure_autoload( self::OPTION_NAME, '0' ); + + // Bail early if Testimonial option is not set and the theme doesn't declare support + if ( empty( $setting ) && ! $this->site_supports_custom_post_type() ) { + return; + } + + if ( ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) && ! Jetpack::is_module_active( 'custom-content-types' ) ) { + return; + } + + // CPT magic + $this->register_post_types(); + add_action( sprintf( 'add_option_%s', self::OPTION_NAME ), array( $this, 'flush_rules_on_enable' ), 10 ); + add_action( sprintf( 'update_option_%s', self::OPTION_NAME ), array( $this, 'flush_rules_on_enable' ), 10 ); + add_action( sprintf( 'publish_%s', self::CUSTOM_POST_TYPE ), array( $this, 'flush_rules_on_first_testimonial' ) ); + add_action( 'after_switch_theme', array( $this, 'flush_rules_on_switch' ) ); + + // Admin Customization + add_filter( 'enter_title_here', array( $this, 'change_default_title' ) ); + add_filter( sprintf( 'manage_%s_posts_columns', self::CUSTOM_POST_TYPE), array( $this, 'edit_title_column_label' ) ); + add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) ); + add_action( 'customize_register', array( $this, 'customize_register' ) ); + + // Only add the 'Customize' sub-menu if the theme supports it. + $num_testimonials = self::count_testimonials(); + if ( ! empty( $num_testimonials ) && current_theme_supports( self::CUSTOM_POST_TYPE ) ) { + add_action( 'admin_menu', array( $this, 'add_customize_page' ) ); + } + + if ( defined( 'IS_WPCOM' ) && IS_WPCOM ) { + // Track all the things + add_action( sprintf( 'add_option_%s', self::OPTION_NAME ), array( $this, 'new_activation_stat_bump' ) ); + add_action( sprintf( 'update_option_%s', self::OPTION_NAME ), array( $this, 'update_option_stat_bump' ), 11, 2 ); + add_action( sprintf( 'publish_%s', self::CUSTOM_POST_TYPE), array( $this, 'new_testimonial_stat_bump' ) ); + + // Add to Dotcom XML sitemaps + add_filter( 'wpcom_sitemap_post_types', array( $this, 'add_to_sitemap' ) ); + } else { + // Add to Jetpack XML sitemap + add_filter( 'jetpack_sitemap_post_types', array( $this, 'add_to_sitemap' ) ); + } + + // Adjust CPT archive and custom taxonomies to obey CPT reading setting + add_filter( 'pre_get_posts', array( $this, 'query_reading_setting' ), 20 ); + add_filter( 'infinite_scroll_settings', array( $this, 'infinite_scroll_click_posts_per_page' ) ); + + // Register [jetpack_testimonials] always and + // register [testimonials] if [testimonials] isn't already set + add_shortcode( 'jetpack_testimonials', array( $this, 'jetpack_testimonial_shortcode' ) ); + + if ( ! shortcode_exists( 'testimonials' ) ) { + add_shortcode( 'testimonials', array( $this, 'jetpack_testimonial_shortcode' ) ); + } + + // If CPT was enabled programatically and no CPT items exist when user switches away, disable + if ( $setting && $this->site_supports_custom_post_type() ) { + add_action( 'switch_theme', array( $this, 'deactivation_post_type_support' ) ); + } + } + + /** + * Add a checkbox field in 'Settings' > 'Writing' + * for enabling CPT functionality. + * + * @return null + */ + function settings_api_init() { + add_settings_field( + self::OPTION_NAME, + '<span class="cpt-options">' . __( 'Testimonials', 'jetpack' ) . '</span>', + array( $this, 'setting_html' ), + 'writing', + 'jetpack_cpt_section' + ); + + register_setting( + 'writing', + self::OPTION_NAME, + 'intval' + ); + + // Check if CPT is enabled first so that intval doesn't get set to NULL on re-registering + if ( $this->site_supports_custom_post_type() ) { + register_setting( + 'writing', + self::OPTION_READING_SETTING, + 'intval' + ); + } + } + + /** + * HTML code to display a checkbox true/false option + * for the CPT setting. + * + * @return html + */ + function setting_html() { + if ( current_theme_supports( self::CUSTOM_POST_TYPE ) ) : ?> + <p><?php printf( __( 'Your theme supports Testimonials', 'jetpack' ) ); ?></p> + <?php else : ?> + <label for="<?php echo esc_attr( self::OPTION_NAME ); ?>"> + <input name="<?php echo esc_attr( self::OPTION_NAME ); ?>" id="<?php echo esc_attr( self::OPTION_NAME ); ?>" <?php echo checked( get_option( self::OPTION_NAME, '0' ), true, false ); ?> type="checkbox" value="1" /> + <?php esc_html_e( 'Enable Testimonials for this site.', 'jetpack' ); ?> + <a target="_blank" href="http://en.support.wordpress.com/testimonials/"><?php esc_html_e( 'Learn More', 'jetpack' ); ?></a> + </label> + <?php endif; + + if ( $this->site_supports_custom_post_type() ) : + printf( '<p><label for="%1$s">%2$s</label></p>', + esc_attr( self::OPTION_READING_SETTING ), + /* translators: %1$s is replaced with an input field for numbers */ + sprintf( __( 'Testimonial pages display at most %1$s testimonials', 'jetpack' ), + sprintf( '<input name="%1$s" id="%1$s" type="number" step="1" min="1" value="%2$s" class="small-text" />', + esc_attr( self::OPTION_READING_SETTING ), + esc_attr( get_option( self::OPTION_READING_SETTING, '10' ) ) + ) + ) + ); + endif; + } + + /** + * Should this Custom Post Type be made available? + */ + function site_supports_custom_post_type() { + // If the current theme requests it. + if ( current_theme_supports( self::CUSTOM_POST_TYPE ) || get_option( self::OPTION_NAME, '0' ) ) { + return true; + } + + // Otherwise, say no unless something wants to filter us to say yes. + /** This action is documented in modules/custom-post-types/nova.php */ + return (bool) apply_filters( 'jetpack_enable_cpt', false, self::CUSTOM_POST_TYPE ); + } + + /** + * Add to REST API post type whitelist + */ + function allow_cpt_rest_api_type( $post_types ) { + $post_types[] = self::CUSTOM_POST_TYPE; + + return $post_types; + } + + /** + * Bump Testimonial > New Activation stat + */ + function new_activation_stat_bump() { + /** This action is documented in modules/widgets/social-media-icons.php */ + do_action( 'jetpack_bump_stats_extras', 'testimonials', 'new-activation' ); + } + + /** + * Bump Testimonial > Option On/Off stats to get total active + */ + function update_option_stat_bump( $old, $new ) { + if ( empty( $old ) && ! empty( $new ) ) { + /** This action is documented in modules/widgets/social-media-icons.php */ + do_action( 'jetpack_bump_stats_extras', 'testimonials', 'option-on' ); + } + + if ( ! empty( $old ) && empty( $new ) ) { + /** This action is documented in modules/widgets/social-media-icons.php */ + do_action( 'jetpack_bump_stats_extras', 'testimonials', 'option-off' ); + } + } + + /** + * Bump Testimonial > Published Testimonials stat when testimonials are published + */ + function new_testimonial_stat_bump() { + /** This action is documented in modules/widgets/social-media-icons.php */ + do_action ( 'jetpack_bump_stats_extras', 'testimonials', 'published-testimonials' ); + } + + /* + * Flush permalinks when CPT option is turned on/off + */ + function flush_rules_on_enable() { + flush_rewrite_rules(); + } + + /* + * Count published testimonials and flush permalinks when first testimonial is published + */ + function flush_rules_on_first_testimonial() { + $testimonials = get_transient( 'jetpack-testimonial-count-cache' ); + + if ( false === $testimonials ) { + flush_rewrite_rules(); + $testimonials = (int) wp_count_posts( self::CUSTOM_POST_TYPE )->publish; + + if ( ! empty( $testimonials ) ) { + set_transient( 'jetpack-testimonial-count-cache', $testimonials, HOUR_IN_SECONDS * 12 ); + } + } + } + + /* + * Flush permalinks when CPT supported theme is activated + */ + function flush_rules_on_switch() { + if ( current_theme_supports( self::CUSTOM_POST_TYPE ) ) { + flush_rewrite_rules(); + } + } + + /** + * On plugin/theme activation, check if current theme supports CPT + */ + static function activation_post_type_support() { + if ( current_theme_supports( self::CUSTOM_POST_TYPE ) ) { + update_option( self::OPTION_NAME, '1' ); + } + } + + /** + * On theme switch, check if CPT item exists and disable if not + */ + function deactivation_post_type_support() { + $portfolios = get_posts( array( + 'fields' => 'ids', + 'posts_per_page' => 1, + 'post_type' => self::CUSTOM_POST_TYPE, + 'suppress_filters' => false + ) ); + + if ( empty( $portfolios ) ) { + update_option( self::OPTION_NAME, '0' ); + } + } + + /** + * Register Post Type + */ + function register_post_types() { + if ( post_type_exists( self::CUSTOM_POST_TYPE ) ) { + return; + } + + register_post_type( self::CUSTOM_POST_TYPE, array( + 'description' => __( 'Customer Testimonials', 'jetpack' ), + 'labels' => array( + 'name' => esc_html__( 'Testimonials', 'jetpack' ), + 'singular_name' => esc_html__( 'Testimonial', 'jetpack' ), + 'menu_name' => esc_html__( 'Testimonials', 'jetpack' ), + 'all_items' => esc_html__( 'All Testimonials', 'jetpack' ), + 'add_new' => esc_html__( 'Add New', 'jetpack' ), + 'add_new_item' => esc_html__( 'Add New Testimonial', 'jetpack' ), + 'edit_item' => esc_html__( 'Edit Testimonial', 'jetpack' ), + 'new_item' => esc_html__( 'New Testimonial', 'jetpack' ), + 'view_item' => esc_html__( 'View Testimonial', 'jetpack' ), + 'search_items' => esc_html__( 'Search Testimonials', 'jetpack' ), + 'not_found' => esc_html__( 'No Testimonials found', 'jetpack' ), + 'not_found_in_trash' => esc_html__( 'No Testimonials found in Trash', 'jetpack' ), + 'filter_items_list' => esc_html__( 'Filter Testimonials list', 'jetpack' ), + 'items_list_navigation' => esc_html__( 'Testimonial list navigation', 'jetpack' ), + 'items_list' => esc_html__( 'Testimonials list', 'jetpack' ), + ), + 'supports' => array( + 'title', + 'editor', + 'thumbnail', + 'page-attributes', + 'revisions', + 'excerpt', + ), + 'rewrite' => array( + 'slug' => 'testimonial', + 'with_front' => false, + 'feeds' => false, + 'pages' => true, + ), + 'public' => true, + 'show_ui' => true, + 'menu_position' => 20, // below Pages + 'menu_icon' => 'dashicons-testimonial', + 'capability_type' => 'page', + 'map_meta_cap' => true, + 'has_archive' => true, + 'query_var' => 'testimonial', + 'show_in_rest' => true, + ) ); + } + + /** + * Update messages for the Testimonial admin. + */ + function updated_messages( $messages ) { + global $post; + + $messages[ self::CUSTOM_POST_TYPE ] = array( + 0 => '', // Unused. Messages start at index 1. + 1 => sprintf( __( 'Testimonial updated. <a href="%s">View testimonial</a>', 'jetpack'), esc_url( get_permalink( $post->ID ) ) ), + 2 => esc_html__( 'Custom field updated.', 'jetpack' ), + 3 => esc_html__( 'Custom field deleted.', 'jetpack' ), + 4 => esc_html__( 'Testimonial updated.', 'jetpack' ), + /* translators: %s: date and time of the revision */ + 5 => isset( $_GET['revision'] ) ? sprintf( esc_html__( 'Testimonial restored to revision from %s', 'jetpack'), wp_post_revision_title( (int) $_GET['revision'], false ) ) : false, + 6 => sprintf( __( 'Testimonial published. <a href="%s">View testimonial</a>', 'jetpack' ), esc_url( get_permalink( $post->ID ) ) ), + 7 => esc_html__( 'Testimonial saved.', 'jetpack' ), + 8 => sprintf( __( 'Testimonial submitted. <a target="_blank" href="%s">Preview testimonial</a>', 'jetpack'), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) ), + 9 => sprintf( __( 'Testimonial scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview testimonial</a>', 'jetpack' ), + // translators: Publish box date format, see http://php.net/date + date_i18n( __( 'M j, Y @ G:i', 'jetpack' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post->ID) ) ), + 10 => sprintf( __( 'Testimonial draft updated. <a target="_blank" href="%s">Preview testimonial</a>', 'jetpack' ), esc_url( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) ), + ); + + return $messages; + } + + /** + * Change ‘Enter Title Here’ text for the Testimonial. + */ + function change_default_title( $title ) { + if ( self::CUSTOM_POST_TYPE == get_post_type() ) { + $title = esc_html__( "Enter the customer's name here", 'jetpack' ); + } + + return $title; + } + + /** + * Change ‘Title’ column label on all Testimonials page. + */ + function edit_title_column_label( $columns ) { + $columns['title'] = esc_html__( 'Customer Name', 'jetpack' ); + + return $columns; + } + + /** + * Follow CPT reading setting on CPT archive page + */ + function query_reading_setting( $query ) { + if ( ! is_admin() + && $query->is_main_query() + && $query->is_post_type_archive( self::CUSTOM_POST_TYPE ) + ) { + $query->set( 'posts_per_page', get_option( self::OPTION_READING_SETTING, '10' ) ); + } + } + + /* + * If Infinite Scroll is set to 'click', use our custom reading setting instead of core's `posts_per_page`. + */ + function infinite_scroll_click_posts_per_page( $settings ) { + global $wp_query; + + if ( ! is_admin() && true === $settings['click_handle'] && $wp_query->is_post_type_archive( self::CUSTOM_POST_TYPE ) ) { + $settings['posts_per_page'] = get_option( self::OPTION_READING_SETTING, $settings['posts_per_page'] ); + } + + return $settings; + } + + /** + * Add CPT to Dotcom sitemap + */ + function add_to_sitemap( $post_types ) { + $post_types[] = self::CUSTOM_POST_TYPE; + + return $post_types; + } + + function set_testimonial_option() { + $testimonials = wp_count_posts( self::CUSTOM_POST_TYPE ); + $published_testimonials = $testimonials->publish; + + update_option( self::OPTION_NAME, $published_testimonials ); + } + + function count_testimonials() { + $testimonials = get_transient( 'jetpack-testimonial-count-cache' ); + + if ( false === $testimonials ) { + $testimonials = (int) wp_count_posts( self::CUSTOM_POST_TYPE )->publish; + + if ( ! empty( $testimonials ) ) { + set_transient( 'jetpack-testimonial-count-cache', $testimonials, 60*60*12 ); + } + } + + return $testimonials; + } + + /** + * Adds a submenu link to the Customizer. + */ + function add_customize_page() { + add_submenu_page( + 'edit.php?post_type=' . self::CUSTOM_POST_TYPE, + esc_html__( 'Customize Testimonials Archive', 'jetpack' ), + esc_html__( 'Customize', 'jetpack' ), + 'edit_theme_options', + add_query_arg( array( + 'url' => urlencode( home_url( '/testimonial/' ) ), + 'autofocus[section]' => 'jetpack_testimonials' + ), 'customize.php' ) + ); + } + + /** + * Adds testimonial section to the Customizer. + */ + function customize_register( $wp_customize ) { + jetpack_testimonial_custom_control_classes(); + + $wp_customize->add_section( 'jetpack_testimonials', array( + 'title' => esc_html__( 'Testimonials', 'jetpack' ), + 'theme_supports' => self::CUSTOM_POST_TYPE, + 'priority' => 130, + ) ); + + $wp_customize->add_setting( 'jetpack_testimonials[page-title]', array( + 'default' => esc_html__( 'Testimonials', 'jetpack' ), + 'sanitize_callback' => array( 'Jetpack_Testimonial_Title_Control', 'sanitize_content' ), + 'sanitize_js_callback' => array( 'Jetpack_Testimonial_Title_Control', 'sanitize_content' ), + ) ); + $wp_customize->add_control( 'jetpack_testimonials[page-title]', array( + 'section' => 'jetpack_testimonials', + 'label' => esc_html__( 'Testimonial Archive Title', 'jetpack' ), + 'type' => 'text', + ) ); + + $wp_customize->add_setting( 'jetpack_testimonials[page-content]', array( + 'default' => '', + 'sanitize_callback' => array( 'Jetpack_Testimonial_Textarea_Control', 'sanitize_content' ), + 'sanitize_js_callback' => array( 'Jetpack_Testimonial_Textarea_Control', 'sanitize_content' ), + ) ); + $wp_customize->add_control( new Jetpack_Testimonial_Textarea_Control( $wp_customize, 'jetpack_testimonials[page-content]', array( + 'section' => 'jetpack_testimonials', + 'settings' => 'jetpack_testimonials[page-content]', + 'label' => esc_html__( 'Testimonial Archive Content', 'jetpack' ), + ) ) ); + + $wp_customize->add_setting( 'jetpack_testimonials[featured-image]', array( + 'default' => '', + 'sanitize_callback' => 'attachment_url_to_postid', + 'sanitize_js_callback' => 'attachment_url_to_postid', + 'theme_supports' => 'post-thumbnails', + ) ); + $wp_customize->add_control( new WP_Customize_Image_Control( $wp_customize, 'jetpack_testimonials[featured-image]', array( + 'section' => 'jetpack_testimonials', + 'label' => esc_html__( 'Testimonial Archive Featured Image', 'jetpack' ), + ) ) ); + + // The featured image control doesn't display properly in the Customizer unless we coerce + // it back into a URL sooner, since that's what WP_Customize_Upload_Control::to_json() expects + if ( is_admin() ) { + add_filter( 'theme_mod_jetpack_testimonials', array( $this, 'coerce_testimonial_image_to_url' ) ); + } + } + + public function coerce_testimonial_image_to_url( $opt ) { + if ( ! $opt || ! is_array( $opt ) ) { + return $opt; + } + if ( ! isset( $opt['featured-image'] ) || ! is_scalar( $opt['featured-image'] ) ) { + return $opt; + } + $url = wp_get_attachment_url( $opt['featured-image'] ); + if ( $url ) { + $opt['featured-image'] = $url; + } + return $opt; + } + + /** + * Our [testimonial] shortcode. + * Prints Testimonial data styled to look good on *any* theme. + * + * @return jetpack_testimonial_shortcode_html + */ + static function jetpack_testimonial_shortcode( $atts ) { + // Default attributes + $atts = shortcode_atts( array( + 'display_content' => true, + 'image' => true, + 'columns' => 1, + 'showposts' => -1, + 'order' => 'asc', + 'orderby' => 'menu_order,date', + ), $atts, 'testimonial' ); + + // A little sanitization + if ( $atts['display_content'] && 'true' != $atts['display_content'] && 'full' != $atts['display_content'] ) { + $atts['display_content'] = false; + } + + if ( $atts['image'] && 'true' != $atts['image'] ) { + $atts['image'] = false; + } + + $atts['columns'] = absint( $atts['columns'] ); + + $atts['showposts'] = intval( $atts['showposts'] ); + + if ( $atts['order'] ) { + $atts['order'] = urldecode( $atts['order'] ); + $atts['order'] = strtoupper( $atts['order'] ); + if ( 'DESC' != $atts['order'] ) { + $atts['order'] = 'ASC'; + } + } + + if ( $atts['orderby'] ) { + $atts['orderby'] = urldecode( $atts['orderby'] ); + $atts['orderby'] = strtolower( $atts['orderby'] ); + $allowed_keys = array( 'author', 'date', 'title', 'menu_order', 'rand' ); + + $parsed = array(); + foreach ( explode( ',', $atts['orderby'] ) as $testimonial_index_number => $orderby ) { + if ( ! in_array( $orderby, $allowed_keys ) ) { + continue; + } + $parsed[] = $orderby; + } + + if ( empty( $parsed ) ) { + unset($atts['orderby']); + } else { + $atts['orderby'] = implode( ' ', $parsed ); + } + } + + // enqueue shortcode styles when shortcode is used + wp_enqueue_style( 'jetpack-testimonial-style', plugins_url( 'css/testimonial-shortcode.css', __FILE__ ), array(), '20140326' ); + + return self::jetpack_testimonial_shortcode_html( $atts ); + } + + /** + * The Testimonial shortcode loop. + * + * @return html + */ + static function jetpack_testimonial_shortcode_html( $atts ) { + // Default query arguments + $defaults = array( + 'order' => $atts['order'], + 'orderby' => $atts['orderby'], + 'posts_per_page' => $atts['showposts'], + ); + + $args = wp_parse_args( $atts, $defaults ); + $args['post_type'] = self::CUSTOM_POST_TYPE; // Force this post type + $query = new WP_Query( $args ); + + $testimonial_index_number = 0; + + ob_start(); + + // If we have testimonials, create the html + if ( $query->have_posts() ) { + + ?> + <div class="jetpack-testimonial-shortcode column-<?php echo esc_attr( $atts['columns'] ); ?>"> + <?php // open .jetpack-testimonial-shortcode + + // Construct the loop... + while ( $query->have_posts() ) { + $query->the_post(); + $post_id = get_the_ID(); + ?> + <div class="testimonial-entry <?php echo esc_attr( self::get_testimonial_class( $testimonial_index_number, $atts['columns'], has_post_thumbnail( $post_id ) ) ); ?>"> + <?php + // The content + if ( false !== $atts['display_content'] ) { + if ( 'full' === $atts['display_content'] ) { + ?> + <div class="testimonial-entry-content"><?php the_content(); ?></div> + <?php + } else { + ?> + <div class="testimonial-entry-content"><?php the_excerpt(); ?></div> + <?php + } + } + ?> + <span class="testimonial-entry-title">― <a href="<?php echo esc_url( get_permalink() ); ?>" title="<?php echo esc_attr( the_title_attribute( ) ); ?>"><?php the_title(); ?></a></span> + <?php + // Featured image + if ( false !== $atts['image'] ) : + echo self::get_testimonial_thumbnail_link( $post_id ); + endif; + ?> + </div><!-- close .testimonial-entry --> + <?php + $testimonial_index_number++; + } // end of while loop + + wp_reset_postdata(); + ?> + </div><!-- close .jetpack-testimonial-shortcode --> + <?php + } else { ?> + <p><em><?php _e( 'Your Testimonial Archive currently has no entries. You can start creating them on your dashboard.', 'jetpack' ); ?></p></em> + <?php + } + $html = ob_get_clean(); + + // Return the HTML block + return $html; + } + + /** + * Individual testimonial class + * + * @return string + */ + static function get_testimonial_class( $testimonial_index_number, $columns, $image ) { + $class = array(); + + $class[] = 'testimonial-entry-column-'.$columns; + + if( $columns > 1) { + if ( ( $testimonial_index_number % 2 ) == 0 ) { + $class[] = 'testimonial-entry-mobile-first-item-row'; + } else { + $class[] = 'testimonial-entry-mobile-last-item-row'; + } + } + + // add first and last classes to first and last items in a row + if ( ( $testimonial_index_number % $columns ) == 0 ) { + $class[] = 'testimonial-entry-first-item-row'; + } elseif ( ( $testimonial_index_number % $columns ) == ( $columns - 1 ) ) { + $class[] = 'testimonial-entry-last-item-row'; + } + + // add class if testimonial has a featured image + if ( false !== $image ) { + $class[] = 'has-testimonial-thumbnail'; + } + + /** + * Filter the class applied to testimonial div in the testimonial + * + * @module custom-content-types + * + * @since 3.4.0 + * + * @param string $class class name of the div. + * @param int $testimonial_index_number iterator count the number of columns up starting from 0. + * @param int $columns number of columns to display the content in. + * @param boolean $image has a thumbnail or not. + * + */ + return apply_filters( 'testimonial-entry-post-class', implode( " ", $class ) , $testimonial_index_number, $columns, $image ); + } + + /** + * Display the featured image if it's available + * + * @return html + */ + static function get_testimonial_thumbnail_link( $post_id ) { + if ( has_post_thumbnail( $post_id ) ) { + /** + * Change the thumbnail size for the Testimonial CPT. + * + * @module custom-content-types + * + * @since 3.4.0 + * + * @param string|array $var Either a registered size keyword or size array. + */ + return '<a class="testimonial-featured-image" href="' . esc_url( get_permalink( $post_id ) ) . '">' . get_the_post_thumbnail( $post_id, apply_filters( 'jetpack_testimonial_thumbnail_size', 'thumbnail' ) ) . '</a>'; + } + } +} + +function jetpack_testimonial_custom_control_classes() { + class Jetpack_Testimonial_Title_Control extends WP_Customize_Control { + public static function sanitize_content( $value ) { + if ( '' != $value ) + $value = trim( convert_chars( wptexturize( $value ) ) ); + + return $value; + } + } + + class Jetpack_Testimonial_Textarea_Control extends WP_Customize_Control { + public $type = 'textarea'; + + public function render_content() { + ?> + <label> + <span class="customize-control-title"><?php echo esc_html( $this->label ); ?></span> + <textarea rows="5" style="width:100%;" <?php $this->link(); ?>><?php echo esc_textarea( $this->value() ); ?></textarea> + </label> + <?php + } + + public static function sanitize_content( $value ) { + if ( ! empty( $value ) ) + /** This filter is already documented in core. wp-includes/post-template.php */ + $value = apply_filters( 'the_content', $value ); + + $value = preg_replace( '@<div id="jp-post-flair"([^>]+)?>(.+)?</div>@is', '', $value ); // Strip WPCOM and Jetpack post flair if included in content + + return $value; + } + } +} + +add_action( 'init', array( 'Jetpack_Testimonial', 'init' ) ); + +// Check on plugin activation if theme supports CPT +register_activation_hook( __FILE__, array( 'Jetpack_Testimonial', 'activation_post_type_support' ) ); +add_action( 'jetpack_activate_module_custom-content-types', array( 'Jetpack_Testimonial', 'activation_post_type_support' ) ); |