- Location:
- sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook
- Files:
-
- 11 added
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/handbook.php
r10356 r10837 3 3 * Plugin Name: Handbook 4 4 * Description: Features for a handbook, complete with glossary and table of contents 5 * Version: 2.0 5 6 * Author: WordPress.org 6 7 * Author URI: https://wordpress.org/ … … 25 26 require_once __DIR__ . '/inc/blocks.php'; 26 27 28 add_action( 'plugins_loaded', function () { 29 if ( class_exists( 'WordPressdotorg\\Markdown\\Importer' ) ) { 30 require_once __DIR__ . '/inc/importer.php'; 31 } 32 }, 1 ); -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/admin-notices.php
r10356 r10837 9 9 10 10 /** 11 * Constructor.11 * Initializes functionality. 12 12 * 13 13 * @access public 14 14 */ 15 public function __construct() { 16 add_action( 'admin_notices', array( $this, 'show_new_handbook_message' ) ); 15 public static function init() { 16 add_action( 'admin_notices', [ __CLASS__, 'show_new_handbook_message' ] ); 17 add_action( 'admin_notices', [ __CLASS__, 'show_imported_handbook_notice' ] ); 18 add_action( 'admin_notices', [ __CLASS__, 'show_imported_handbook_config_errors' ] ); 17 19 } 18 20 … … 24 26 * @access public 25 27 */ 26 public function show_new_handbook_message() {28 public static function show_new_handbook_message() { 27 29 global $wp_query; 28 30 … … 31 33 // Only show message in listing of handbook posts when no posts are present yet. 32 34 if ( 35 $current_screen 36 && 33 37 'edit' === $current_screen->base 34 38 && … … 36 40 && 37 41 0 === $wp_query->post_count 42 && 43 ( empty( $wp_query->query_vars['post_status'] ) || 'publish' === $wp_query->query_vars['post_status'] ) 38 44 ) { 39 45 echo '<div class="notice notice-success"><p>'; 46 47 $suggested_slugs = array_unique( [ 48 str_replace( '-handbook', '', $current_screen->post_type ), 49 'welcome', 50 $current_screen->post_type, 51 'handbook', 52 ] ); 53 $suggested_slugs = array_map( function( $x ) { return "<code>{$x}</code>"; }, $suggested_slugs ); 54 40 55 printf( 41 56 /* translators: 1: example landing page title that includes post type name, 2: comma-separated list of acceptable post slugs */ 42 __( '<strong>Welcome to your new handbook!</strong> It is recommended that the first post you create is the landing page for the handbook. You can title it anything you like (suggestions: <code>%1$s</code> or <code>Welcome</code>). However, you must ensure that it has one of the following slugs: %2$s. ', 'wporg' ),57 __( '<strong>Welcome to your new handbook!</strong> It is recommended that the first post you create is the landing page for the handbook. You can title it anything you like (suggestions: <code>%1$s</code> or <code>Welcome</code>). However, you must ensure that it has one of the following slugs: %2$s. The slug will ultimately be omitted from the page‘s permalink URL, but will still appear in the permalinks for sub-pages.', 'wporg' ), 43 58 WPorg_Handbook::get_name( $current_screen->post_type ), 44 '<code>' . str_replace( '-handbook', '', $current_screen->post_type ) . '</code>, <code>welcome</code>, <code>' . $current_screen->post_type . '</code>, <code>handbook</code>'59 implode( ', ', $suggested_slugs ) 45 60 ); 46 61 echo "</p></div>\n"; … … 48 63 } 49 64 65 /** 66 * Outputs admin notice indicating the handbook is an imported handbook, if applicable. 67 * 68 * @access public 69 */ 70 public static function show_imported_handbook_notice() { 71 global $wp_query; 72 73 // Bail if handbook importer is not available. 74 if ( ! class_exists( 'WPorg_Handbook_Importer' ) ) { 75 return; 76 } 77 78 $current_screen = get_current_screen(); 79 80 // Only show message in listing of handbook posts when no posts are present yet. 81 if ( 82 $current_screen 83 && 84 'edit' === $current_screen->base 85 && 86 in_array( $current_screen->post_type, wporg_get_handbook_post_types() ) 87 && 88 WPorg_Handbook_Importer::is_handbook_imported( $current_screen->post_type ) 89 ) { 90 $handbook_config = WPorg_Handbook_Init::get_handbooks_config( $current_screen->post_type ); 91 92 $handbook = WPorg_Handbook_Init::get_handbook( $current_screen->post_type ); 93 if ( ! $handbook ) { 94 return; 95 } 96 97 $importer = $handbook->get_importer(); 98 $interval = $importer ? $importer->get_cron_interval( false ) : []; 99 $interval_display = ! empty( $interval['display'] ) ? strtolower( $interval['display'] ) : __( 'DISABLED', 'wporg' ); 100 101 echo '<div class="notice notice-info"><p>'; 102 printf( 103 /* translators: 1: URL to remote manifest. 2: cron interval. */ 104 __( '<strong>This is an imported handbook!</strong> This handbook is imported according to a <a href="%1$s">remote manifest</a>. Any local changes will be overwritten during the next import, so make any changes at the remote location. Import interval: <strong>%2$s</strong>.', 'wporg' ), 105 $handbook_config['manifest'], 106 $interval_display 107 ); 108 echo "</p></div>\n"; 109 } 110 } 111 112 /** 113 * Outputs admin error notice(s) for any misconfigured imported handbooks. 114 * 115 * @access public 116 */ 117 public static function show_imported_handbook_config_errors() { 118 global $wp_query; 119 120 // Bail if handbook importer is not available. 121 if ( ! class_exists( 'WPorg_Handbook_Importer' ) ) { 122 return; 123 } 124 125 $current_screen = get_current_screen(); 126 127 // Only show message in listing of handbook posts when no posts are present yet. 128 if ( 129 $current_screen 130 && 131 'edit' === $current_screen->base 132 && 133 in_array( $current_screen->post_type, wporg_get_handbook_post_types() ) 134 && 135 WPorg_Handbook_Importer::is_handbook_imported( $current_screen->post_type ) 136 ) { 137 $handbook_config = WPorg_Handbook_Init::get_handbooks_config( $current_screen->post_type ); 138 139 $handbook = WPorg_Handbook_Init::get_handbook( $current_screen->post_type ); 140 if ( ! $handbook ) { 141 return; 142 } 143 144 $handbook_config = $handbook->get_config(); 145 $cron_intervals = wp_get_schedules(); 146 $interval_display = $handbook_config[ 'cron_interval' ] ?? ''; 147 148 if ( ! empty( $cron_intervals[ $interval_display ] ) ) { 149 return; 150 } 151 152 echo '<div class="notice notice-warning"><p>'; 153 printf( 154 /* translators: %s: cron interval. */ 155 __( '<strong>Misconfigured cron interval!</strong> This imported handbook has a misconfigured cron interval. The config defines an interval of <strong>%s</strong>, which has not been defined. The fallback import interval shown in a notice above includes the default cron interval currently in use.', 'wporg' ), 156 $interval_display 157 ); 158 echo "</p></div>\n"; 159 } 160 } 50 161 } 51 162 52 $admin_notices = new WPorg_Handbook_Admin_Notices();163 add_action( 'plugins_loaded', [ 'WPorg_Handbook_Admin_Notices', 'init' ] ); -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/breadcrumbs.php
r10356 r10837 30 30 public static function do_init() { 31 31 // Note if the WPorg_Handbook_Pages_Widget widget is in use. 32 if ( is_active_widget( false, false, WPorg_Handbook_Pages_Widget::get_widget_id_base(), true ) ) {32 if ( class_exists( 'WPorg_Handbook_Pages_Widget' ) && is_active_widget( false, false, WPorg_Handbook_Pages_Widget::get_widget_id_base(), true ) ) { 33 33 self::$using_pages_widget = true; 34 34 } … … 54 54 55 55 // Second link is always link to handbook home page. 56 $handbook_name = wporg_get_current_handbook_name(); 56 57 if ( wporg_is_handbook_landing_page() ) { 57 $links[] = __( 'Handbook', 'wporg' );58 $links[] = $handbook_name; 58 59 } else { 59 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( wporg_get_current_handbook_home_url() ), __( 'Handbook', 'wporg' ));60 $links[] = sprintf( '<a href="%s">%s</a>', esc_url( wporg_get_current_handbook_home_url() ), $handbook_name ); 60 61 } 61 62 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/handbook.php
r10356 r10837 8 8 class WPorg_Handbook { 9 9 10 /** 11 * The handbook post type. 12 * 13 * @var string 14 */ 10 15 public $post_type = ''; 16 17 /** 18 * The handbook's settings. 19 * 20 * @var array 21 */ 22 public $settings = []; 23 24 /** 25 * The name of the setting for the handbook's name. 26 * 27 * @var string 28 */ 11 29 public $setting_name = ''; 12 30 31 /** 32 * The memoized and filtered label text for the handbook. 33 * 34 * @var string 35 */ 13 36 protected $label = ''; 14 37 15 static function caps() { 16 return array( 17 'edit_handbook_pages', 'edit_others_handbook_pages', 38 /** 39 * The associated importer object, if warranted. 40 */ 41 protected $importer; 42 43 /** 44 * Returns the custom handbook-related capabilities granted to site users. 45 * 46 * @return array 47 */ 48 public static function caps() { 49 return [ 50 'edit_handbook_pages', 51 'edit_others_handbook_pages', 18 52 'edit_published_handbook_pages', 19 ); 20 } 21 22 static function editor_caps() { 23 return array( 53 ]; 54 } 55 56 /** 57 * Returns the custom capabilities granted to handbook editors. 58 * 59 * @return array 60 */ 61 public static function editor_caps() { 62 return [ 24 63 'publish_handbook_pages', 25 'delete_handbook_pages', 'delete_others_handbook_pages', 26 'delete_published_handbook_pages', 'delete_private_handbook_pages', 27 'edit_private_handbook_pages', 'read_private_handbook_pages', 28 ); 64 'delete_handbook_pages', 65 'delete_others_handbook_pages', 66 'delete_published_handbook_pages', 67 'delete_private_handbook_pages', 68 'edit_private_handbook_pages', 69 'read_private_handbook_pages', 70 ]; 71 } 72 73 /** 74 * Returns handbook default config. 75 * 76 * @return array 77 */ 78 public static function get_default_handbook_config() { 79 /** 80 * Filters default handbook configuration array. 81 * 82 * @param array $config { 83 * Associative array of handbook configuration. 84 * 85 * @type string $cron_interval The cron interval for which an imported handbook gets 86 * imported, e.g. 'hourly', 'daily'. If defined as an 87 * unrecognized interval, 'hourly' will be used. 88 * Default '15_minutes'. 89 * @type string $label The label for the handbook. Default is the 90 * post type slug converted to titlecase (e.g. 91 * plugin-handbok => "Plugin Handbook"). 92 * @type string manifest The URL to the manifest JSON file for an imported 93 * handbook. 94 * @type string $slug The slug for the post type. Default is the 95 * post type. 96 * } 97 */ 98 return (array) apply_filters( 'handbook_default_handbook_config', [ 99 'cron_interval' => '15_minutes', 100 'label' => '', 101 'manifest' => '', 102 'slug' => '', 103 ] ); 29 104 } 30 105 … … 38 113 * @return string 39 114 */ 40 static function get_name( $post_type = 'handbook', $raw = false ) {115 public static function get_name( $post_type = 'handbook', $raw = false ) { 41 116 // Prefer explicitly configured handbook name. 42 117 $name = get_option( $post_type . '_name' ); 43 118 119 // If handbook name isn't set, try configured label. 120 if ( ! $raw && ! $name ) { 121 $config = WPorg_Handbook_Init::get_handbooks_config( $post_type ); 122 if ( ! empty( $config['label'] ) ) { 123 $name = $config['label']; 124 } 125 } 126 44 127 // If handbook name isn't set, try root relative site path. 45 if ( ! $raw && empty( $name )) {128 if ( ! $raw && ! $name ) { 46 129 if ( is_multisite() ) { 47 130 $name = trim( get_blog_details()->path, '/' ); … … 51 134 52 135 // If no name defined yet, try handbook post type if not standard. 53 if ( empty( $name ) && ( 'handbook' != $post_type ) ) {54 $name = ucfirst( substr( $post_type, 0, -9 ));136 if ( ! $name && ( 'handbook' !== $post_type ) ) { 137 $name = str_replace( '-handbook', '', $post_type ); 55 138 } 56 139 57 140 $name .= ' Handbook'; 141 $name = ucfirst( $name ); 58 142 } 59 143 … … 61 145 } 62 146 63 function __construct( $type ) { 64 if ( 'handbook' != $type ) { 65 $this->post_type = $type . '-handbook'; 66 } else { 67 $this->post_type = $type; 68 } 69 70 $this->label = ucwords( str_replace( array( '-', '_' ), ' ', $this->post_type ) ); 71 $this->label = apply_filters( 'handbook_label', $this->label, $this->post_type ); 147 /** 148 * Constructor 149 * 150 * @param string $type The post type for the handbook. 151 * @param array $config The config array for the handbook. 152 */ 153 public function __construct( $type, $config = [] ) { 154 $this->post_type = sanitize_title( $type ); 155 156 $config = $this->config = wp_parse_args( $config, self::get_default_handbook_config() ); 157 158 $this->label = apply_filters( 159 'handbook_label', 160 $config['label'] ?: ucwords( str_replace( [ '-', '_' ], ' ', $this->post_type ) ), 161 $this->post_type 162 ); 72 163 73 164 $this->setting_name = $this->post_type . '_name'; 74 165 75 add_filter( 'user_has_cap', array( $this, 'grant_handbook_caps' ) ); 76 add_action( 'widgets_init', array( $this, 'register_post_type' ) ); 77 add_filter( 'post_type_link', array( $this, 'post_type_link' ), 10, 2 ); 78 add_action( 'template_redirect', array( $this, 'redirect_handbook_root_page' ) ); 79 add_filter( 'template_include', array( $this, 'template_include' ) ); 80 add_filter( 'pre_get_posts', array( $this, 'pre_get_posts' ) ); 81 add_action( 'widgets_init', array( $this, 'handbook_sidebar' ), 11 ); // After P2 82 add_action( 'wporg_email_changes_for_post_types', array( $this, 'wporg_email_changes_for_post_types' ) ); 83 add_action( 'p2_action_links', array( $this, 'disable_p2_resolved_posts_action_links' ) ); 84 add_action( 'admin_init', array( $this, 'add_name_setting' ) ); 85 add_filter( 'body_class', array( $this, 'add_body_class' ) ); 86 add_filter( 'post_class', array( $this, 'add_post_class' ) ); 87 add_filter( 'o2_process_the_content', array( $this, 'disable_o2_processing' ) ); 88 add_filter( 'o2_application_container', array( $this, 'o2_application_container' ) ); 89 add_filter( 'o2_view_type', array( $this, 'o2_view_type' ) ); 90 add_filter( 'o2_post_fragment', array( $this, 'o2_post_fragment' ) ); 91 add_filter( 'comments_open', array( $this, 'comments_open' ), 10, 2 ); 92 add_filter( 'wp_nav_menu_objects', array( $this, 'highlight_menu_handbook_link' ) ); 93 add_filter( 'display_post_states', array( $this, 'display_post_states' ), 10, 2 ); 166 add_action( 'after_handbooks_init', [ $this, 'init_importer' ] ); 167 add_filter( 'user_has_cap', [ $this, 'grant_handbook_caps' ] ); 168 add_action( 'widgets_init', [ $this, 'register_post_type' ] ); 169 add_filter( 'post_type_link', [ $this, 'post_type_link' ], 10, 2 ); 170 add_action( 'template_redirect', [ $this, 'redirect_handbook_root_page' ] ); 171 add_filter( 'template_include', [ $this, 'template_include' ] ); 172 add_filter( 'pre_get_posts', [ $this, 'pre_get_posts' ] ); 173 add_filter( 'posts_pre_query', [ $this, 'posts_pre_query' ], 10, 2 ); 174 add_action( 'widgets_init', [ $this, 'handbook_sidebar' ], 11 ); // After P2 175 add_action( 'wporg_email_changes_for_post_types', [ $this, 'wporg_email_changes_for_post_types' ] ); 176 add_action( 'p2_action_links', [ $this, 'disable_p2_resolved_posts_action_links' ] ); 177 add_action( 'admin_init', [ $this, 'add_name_setting' ] ); 178 add_filter( 'body_class', [ $this, 'add_body_class' ] ); 179 add_filter( 'post_class', [ $this, 'add_post_class' ] ); 180 add_filter( 'o2_process_the_content', [ $this, 'disable_o2_processing' ] ); 181 add_filter( 'o2_application_container', [ $this, 'o2_application_container' ] ); 182 add_filter( 'o2_view_type', [ $this, 'o2_view_type' ] ); 183 add_filter( 'o2_post_fragment', [ $this, 'o2_post_fragment' ] ); 184 add_filter( 'comments_open', [ $this, 'comments_open' ], 10, 2 ); 185 add_filter( 'wp_nav_menu_objects', [ $this, 'highlight_menu_handbook_link' ] ); 186 add_filter( 'display_post_states', [ $this, 'display_post_states' ], 10, 2 ); 187 } 188 189 /** 190 * Returns the configuration array for handbooks. 191 * 192 * @return array 193 */ 194 public function get_config() { 195 return $this->config; 196 } 197 198 /** 199 * Returns the handbook's importer object, if applicable. 200 * 201 * @return WPorg_Handbook_Importer|null 202 */ 203 public function get_importer() { 204 return $this->importer; 205 } 206 207 /** 208 * Initializes the importer, if applicable. 209 */ 210 public function init_importer() { 211 $config = $this->get_config(); 212 213 if ( class_exists( 'WPorg_Handbook_Importer' ) ) { 214 if ( WPorg_Handbook_Importer::is_handbook_imported( $this->post_type ) ) { 215 $this->importer = new WPorg_Handbook_Importer( $this ); 216 } 217 } elseif ( is_admin() && ( $config['manifest'] ?: false ) ) { 218 add_action( 'admin_notices', function () { 219 echo '<div class="notice notice-error"><p>' . __( 'Error: The <strong>WPORG Markdown Importer</strong> plugin needs to be activated in order to allow importing of handbooks.', 'wporg' ) . '</p></div>'; 220 } ); 221 } 94 222 } 95 223 … … 101 229 * @return string[] 102 230 */ 103 function display_post_states( $post_states, $post ) {231 public function display_post_states( $post_states, $post ) { 104 232 if ( $this->post_is_landing_page( $post ) ) { 105 233 $post_states[] = __( 'Handbook Front Page', 'wporg' ); … … 119 247 * @return array 120 248 */ 121 function add_body_class( $classes ) {249 public function add_body_class( $classes ) { 122 250 if ( is_singular() && wporg_is_handbook( $this->post_type ) ) { 123 251 $classes[] = 'single-handbook'; … … 142 270 * @return array 143 271 */ 144 function add_post_class( $classes ) {272 public function add_post_class( $classes ) { 145 273 if ( $this->post_type === get_post_type() ) { 146 274 $classes[] = 'type-handbook'; … … 150 278 } 151 279 152 function add_name_setting() { 280 /** 281 * Adds the setting for the handbook's name. 282 */ 283 public function add_name_setting() { 153 284 register_setting( 'general', $this->setting_name, 'esc_attr' ); 154 285 155 $label = ( 'handbook' == $this->post_type ) ?286 $label = ( 'handbook' === $this->post_type ) ? 156 287 __( 'Handbook name', 'wporg' ) : 157 sprintf( __( 'Handbook name (%s)', 'wporg' ), s ubstr( $this->post_type, 0, -9) );288 sprintf( __( 'Handbook name (%s)', 'wporg' ), str_replace( '-handbook', '', $this->post_type ) ); 158 289 159 290 add_settings_field( 160 291 $this->setting_name, 161 292 '<label for="' . esc_attr( $this->setting_name ) . '">' . $label . '</label>', 162 array( $this, 'name_setting_html' ),293 [ $this, 'name_setting_html' ], 163 294 'general' 164 295 ); 165 296 } 166 297 167 function name_setting_html() { 298 /** 299 * Outputs the HTML for the input field for the handbook's name. 300 */ 301 public function name_setting_html() { 168 302 $value = get_option( $this->setting_name, '' ); 169 303 echo '<input type="text" id="' . esc_attr( $this->setting_name ) . '" name="' . esc_attr( $this->setting_name ) . '" value="' . esc_attr( $value ) . '" class="regular-text ltr" />'; 170 304 } 171 305 172 function grant_handbook_caps( $caps ) { 306 /** 307 * Grants handbook caps to the current user. 308 * 309 * @return array 310 */ 311 public function grant_handbook_caps( $caps ) { 173 312 if ( ! is_user_member_of_blog() ) { 174 313 return $caps; … … 188 327 } 189 328 190 function register_post_type() { 191 if ( 'handbook' != $this->post_type ) { 192 $slug = substr( $this->post_type, 0, -9 ); 329 /** 330 * Registers handbook post types. 331 */ 332 public function register_post_type() { 333 $config = $this->get_config(); 334 335 if ( ! empty( $config['slug'] ) ) { 336 $slug = $config['slug']; 337 } elseif ( 'handbook' !== $this->post_type ) { 338 $slug = str_replace( '-handbook', '', $this->post_type ); 193 339 } else { 194 340 $slug = 'handbook'; 195 341 } 196 342 197 $default_config = array(198 'labels' => array(343 $default_config = [ 344 'labels' => [ 199 345 'name' => $this->label, 200 346 'singular_name' => sprintf( __( '%s Page', 'wporg' ), $this->label ), 201 347 'menu_name' => $this->label, 202 348 'all_items' => sprintf( __( '%s Pages', 'wporg' ), $this->label ), 203 ),349 ], 204 350 'public' => true, 205 351 'show_ui' => true, … … 211 357 'menu_icon' => 'dashicons-book', 212 358 'menu_position' => 11, 213 'rewrite' => array(359 'rewrite' => [ 214 360 'feeds' => false, 215 361 'slug' => $slug, 216 362 'with_front' => false, 217 ),363 ], 218 364 'delete_with_user' => false, 219 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'revisions', 'wpcom-markdown' ),220 );365 'supports' => [ 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'revisions', 'wpcom-markdown' ], 366 ]; 221 367 // Allow customization of the default post type configuration via filter. 222 $config = apply_filters( 'handbook_post_type_defaults', $default_config, $slug ); 223 224 $this->label = $config['labels']['name']; 368 $config = (array) apply_filters( 'handbook_post_type_defaults', $default_config, $slug ); 369 370 // Override the presumed label with a potentially customized value. 371 if ( ! empty( $config['labels']['name'] ) ) { 372 $this->label = $config['labels']['name']; 373 } 225 374 226 375 register_post_type( $this->post_type, $config ); … … 235 384 * handbook's landing page. 236 385 */ 237 p rotectedfunction post_is_landing_page( $post = null ) {386 public function post_is_landing_page( $post = null ) { 238 387 $is_landing_page = false; 239 388 … … 269 418 * @param WP_Post $post The post in question. 270 419 */ 271 function post_type_link( $post_link, $post ) {420 public function post_type_link( $post_link, $post ) { 272 421 $post_type = get_post_type( $post ); 273 422 … … 284 433 * post type archive link for the handbook. 285 434 */ 286 function redirect_handbook_root_page() {435 public function redirect_handbook_root_page() { 287 436 global $wp_query; 288 437 … … 309 458 * @return string 310 459 */ 311 function template_include( $template ) {460 public function template_include( $template ) { 312 461 global $wp_query; 313 462 … … 317 466 } 318 467 319 $handbook_templates = array();468 $handbook_templates = []; 320 469 321 470 // For singular handbook pages not of the 'handbook' post type. 322 471 if ( is_singular( $this->post_type ) && 'handbook' !== $this->post_type ) { 323 $handbook_templates = array( "single-{$this->post_type}.php", 'single-handbook.php' );472 $handbook_templates = [ "single-{$this->post_type}.php", 'single-handbook.php' ]; 324 473 } 325 474 // For handbook landing page. … … 340 489 } 341 490 342 function pre_get_posts( $query ) { 491 /** 492 * Pre-emptively sets the query posts to the handbook landing page when 493 * appropriate. 494 * 495 * @param array $posts Posts. 496 * @param WP_Query $query Query object. 497 * @return array 498 */ 499 public function posts_pre_query( $posts, $query ) { 500 if ( $query->is_main_query() && ! $query->is_admin && ! $query->is_search && $query->is_handbook_root ) { 501 $posts = [ $query->is_handbook_root ]; 502 } 503 504 return $posts; 505 } 506 507 /** 508 * Performs query object adjustments for handbook requests prior to querying 509 * for posts. 510 */ 511 public function pre_get_posts( $query ) { 343 512 // Bail early if query is not for this handbook's post type. 344 513 if ( get_query_var( 'post_type' ) !== $this->post_type ) { … … 357 526 $page = get_page_by_path( $this->post_type, OBJECT, $this->post_type ); 358 527 if ( ! $page ) { 359 $slug = substr( $this->post_type, 0, -9 ); 360 $page = get_page_by_path( $slug, OBJECT, $this->post_type ); 361 } 362 if ( ! $page ) { 528 $slug = str_replace( '-handbook', '', $this->post_type ); 529 if ( $slug !== $this->post_type ) { 530 $page = get_page_by_path( $slug, OBJECT, $this->post_type ); 531 } 532 } 533 if ( ! $page && 'handbook' !== $this->post_type ) { 363 534 $page = get_page_by_path( 'handbook', OBJECT, $this->post_type ); 364 535 } 365 if ( ! $page ) {536 if ( ! $page && 'welcome' !== $this->post_type ) { 366 537 $page = get_page_by_path( 'welcome', OBJECT, $this->post_type ); 367 538 } 368 539 if ( $page ) { 369 540 $query->set( 'page_id', $page->ID ); 370 $query->is_handbook_root = true;541 $query->is_handbook_root = $page; 371 542 372 543 $query->is_archive = false; … … 379 550 } 380 551 381 function handbook_sidebar() { 382 $sidebar_args = array( 383 'id' => $this->post_type, 384 'name' => sprintf( __( '%s Sidebar', 'wporg' ), $this->label ), 385 'description' => sprintf( __( 'Used on %s pages', 'wporg' ), $this->label ), 552 /** 553 * Registers sidebar and widgets for handbook pages. 554 */ 555 public function handbook_sidebar() { 556 $sidebar_args = [ 557 'id' => $this->post_type, 558 'name' => sprintf( __( '%s Sidebar', 'wporg' ), $this->label ), 559 'description' => sprintf( __( 'Used on %s pages', 'wporg' ), $this->label ), 386 560 'before_widget' => '<aside id="%1$s" class="widget %2$s">', 387 561 'after_widget' => '</aside>', 388 562 'before_title' => '<h2 class="widget-title">', 389 563 'after_title' => '</h2>', 390 );564 ]; 391 565 392 566 $sidebar_args = apply_filters( 'wporg_handbook_sidebar_args', $sidebar_args, $this ); … … 398 572 } 399 573 400 function wporg_email_changes_for_post_types( $post_types ) { 574 /** 575 * Amends list of post types for which users can opt into receiving emails 576 * about changes. 577 * 578 * @param array $post_types Post types. 579 * @return array 580 */ 581 public function wporg_email_changes_for_post_types( $post_types ) { 401 582 if ( ! in_array( $this->post_type, $post_types ) ) { 402 583 $post_types[] = $this->post_type; … … 410 591 * if that plugin is active. 411 592 */ 412 function disable_p2_resolved_posts_action_links() {413 if ( ( $this->post_type == get_post_type() ) && class_exists( 'P2_Resolved_Posts' ) && isset( $GLOBALS['p2_resolved_posts'] ) && is_object( $GLOBALS['p2_resolved_posts'] ) ) {414 remove_filter( 'p2_action_links', array( P2_Resolved_Posts::instance(), 'p2_action_links' ), 100 );593 public function disable_p2_resolved_posts_action_links() { 594 if ( ( $this->post_type === get_post_type() ) && class_exists( 'P2_Resolved_Posts' ) && isset( $GLOBALS['p2_resolved_posts'] ) && is_object( $GLOBALS['p2_resolved_posts'] ) ) { 595 remove_filter( 'p2_action_links', [ P2_Resolved_Posts::instance(), 'p2_action_links' ], 100 ); 415 596 } 416 597 } … … 422 603 * @return bool 423 604 */ 424 function disable_o2_processing( $process_with_o2 ) {605 public function disable_o2_processing( $process_with_o2 ) { 425 606 return ( is_singular() && $this->post_type === get_post_type() ) ? false : $process_with_o2; 426 607 } … … 432 613 * @return string 433 614 */ 434 function o2_application_container( $container ) {615 public function o2_application_container( $container ) { 435 616 return ( is_singular() && $this->post_type === get_post_type() ) ? '#primary' : $container; 436 617 } … … 443 624 * @return string 444 625 */ 445 function o2_view_type( $view_type ) {626 public function o2_view_type( $view_type ) { 446 627 return ( is_singular() && $this->post_type === get_post_type() ) ? 'single' : $view_type; 447 628 } … … 453 634 * @return array 454 635 */ 455 function o2_post_fragment( $post_fragment ) { 636 public function o2_post_fragment( $post_fragment ) { 637 if ( empty( $post_fragment['id'] ) ) { 638 return $post_fragment; 639 } 640 456 641 $post = get_post( $post_fragment['id'] ); 457 642 if ( ! $post ) { … … 473 658 * @return bool 474 659 */ 475 function comments_open( $open, $post_id ) {660 public function comments_open( $open, $post_id ) { 476 661 $post = get_post( $post_id ); 477 662 if ( ! $post ) { … … 499 684 * @return array 500 685 */ 501 function highlight_menu_handbook_link( $menu_items ) {686 public function highlight_menu_handbook_link( $menu_items ) { 502 687 // Must be on a handbook page that isn't the handbook landing page (which will already be handled). 503 if ( ! is_page( array( 'handbook', 'handbooks' )) && ( ! wporg_is_handbook() || wporg_is_handbook_landing_page() ) ) {688 if ( ! is_page( [ 'handbook', 'handbooks' ] ) && ( ! wporg_is_handbook() || wporg_is_handbook_landing_page() ) ) { 504 689 return $menu_items; 505 690 } 506 691 507 692 // Menu must not have an item that is already noted as being current. 508 $current_menu_item = wp_filter_object_list( $menu_items, array( 'current' => true ));693 $current_menu_item = wp_filter_object_list( $menu_items, [ 'current' => true ] ); 509 694 if ( $current_menu_item ) { 510 695 return $menu_items; … … 512 697 513 698 // Menu must have an item that links to handbook home page. 514 $root_handbook_menu_item = wp_filter_object_list( $menu_items, array( 'url' => wporg_get_current_handbook_home_url() ));699 $root_handbook_menu_item = wp_filter_object_list( $menu_items, [ 'url' => wporg_get_current_handbook_home_url() ] ); 515 700 if ( ! $root_handbook_menu_item ) { 516 701 // Or it must have an item that links to a 'handbook' or 'handbooks' page. … … 518 703 $page = get_page_by_path( $page_slug ); 519 704 if ( $page ) { 520 $root_handbook_menu_item = wp_filter_object_list( $menu_items, array( 'object_id' => $page->ID ));705 $root_handbook_menu_item = wp_filter_object_list( $menu_items, [ 'object_id' => $page->ID ] ); 521 706 } 522 707 } -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/init.php
r10356 r10837 8 8 class WPorg_Handbook_Init { 9 9 10 public static function get_post_types() { 11 return (array) apply_filters( 'handbook_post_types', array( 'handbook' ) ); 10 /** 11 * Asociative array of WPorg_Handbook objects. 12 * 13 * @var array 14 */ 15 protected static $handbooks = []; 16 17 /** 18 * Returns the handbook objects. 19 * 20 * @return WPorg_Handbook[] 21 */ 22 public static function get_handbook_objects() { 23 return self::$handbooks; 12 24 } 13 25 14 static function init() { 26 /** 27 * Returns a handbook of the given post type. 28 * 29 * @param string $post_type The handbook post type. 30 * @return WPorg_Handbook|false The handbook object, or false if no such 31 * handbook. 32 */ 33 public static function get_handbook( $post_type ) { 34 $handbooks = self::get_handbook_objects(); 35 return $handbooks[ $post_type ] ?? false; 36 } 15 37 16 $post_types = self::get_post_types(); 38 /** 39 * Returns the post types of all handbooks. 40 * 41 * @return array 42 */ 43 public static function get_post_types() { 44 return array_keys( self::$handbooks ); 45 } 17 46 47 /** 48 * Returns the handbooks configurations. 49 * 50 * @param string $handbook Optional. A specific handbook to return config for. 51 * If none specified, then all are returned. Default ''. 52 * @return array|false If $handbook defined, then the config for that handbook 53 * if handbook exists, else false. If no $handbook specified, 54 * then an associative array of config for all handbooks, 55 * keyed by post type. 56 */ 57 public static function get_handbooks_config( $handbook = '' ) { 58 $return = false; 59 $handbooks = self::get_handbook_objects(); 60 61 // If no handbook specified, return configs for all handbooks. 62 if ( ! $handbook ) { 63 $return = []; 64 foreach ( $handbooks as $type => $handbook_obj ) { 65 $return[ $type ] = $handbook_obj->get_config(); 66 } 67 } 68 69 return ( $handbook && ! empty( $handbooks[ $handbook ] ) && is_a( $handbooks[ $handbook ], 'WPorg_Handbook' ) ) 70 ? $handbooks[ $handbook ]->get_config() 71 : $return; 72 } 73 74 /** 75 * Resets memoized and cached variables. 76 * 77 * @param bool $delete_handbook_objects Optional. Delete associated handbook 78 * objects? Default false. 79 */ 80 public static function reset( $delete_handbook_objects = false ) { 81 if ( $delete_handbook_objects ) { 82 foreach ( self::get_handbook_objects() as $obj ) { 83 unset( $obj ); 84 } 85 } 86 87 self::$handbooks = []; 88 } 89 90 /** 91 * Initializes handbooks. 92 */ 93 public static function init() { 94 $config = []; 95 $handbooks_config = []; 96 97 /** 98 * Fires before handbooks have been initialized. 99 */ 100 do_action( 'before_handbooks_init' ); 101 102 /** 103 * Filters the handbook post types for creating handbooks. 104 * 105 * @deprecated Use {@see 'handbooks_config'} instead. 106 * 107 * @param array $handbooks Array of handbook post types. Default empty 108 * array, which later will be interpreted to 109 * be 'handbook'. 110 */ 111 $post_types = (array) apply_filters( 'handbook_post_types', [] ); 112 113 foreach ( $post_types as $post_type ) { 114 $config[ $post_type ] = []; 115 } 116 117 /** 118 * Defines and configures all handbooks. 119 * 120 * @see WPorg_Handbook::get_default_handbook_config() 121 * 122 * @param array $config Associative array of handbooks and their 123 * configuration options. Keys should be the handbook 124 * post type (which will get appended '-handbook' if 125 * the post type isn't 'handbook' and doesn't already 126 * contain '-handbook'. See 127 * {@see WPorg_Handbook::get_default_handbook_config()} 128 * for list of per-handbook configuration options. 129 */ 130 $config = (array) apply_filters( 'handbooks_config', $config ); 131 132 // If no handbooks were configured, default to a basic handbook. 133 if ( ! $config ) { 134 $config = [ 'handbook' => [] ]; 135 } 136 137 // Get default settings for a handbook. 138 $defaults = WPorg_Handbook::get_default_handbook_config(); 139 140 // Determine each handbook's config. 141 foreach ( $config as $key => $value ) { 142 $key = sanitize_title( $key ); 143 $post_type = ( 'handbook' === $key || false !== strpos( $key, '-handbook' ) ) ? $key : $key . '-handbook'; 144 145 $handbooks_config[ $post_type ] = wp_parse_args( $value, $defaults ); 146 147 // Set slug if not explicitly set. 148 if ( empty( $handbooks_config[ $post_type ]['slug'] ) ) { 149 $handbooks_config[ $post_type ]['slug'] = $key; 150 } 151 } 152 153 $post_types = array_keys( $handbooks_config ); 154 155 // Enable table of contents. 18 156 new WPorg_Handbook_TOC( $post_types ); 19 157 20 foreach ( $post_types as $type ) { 21 new WPorg_Handbook( $type ); 158 // Instantiate each of the handbooks. 159 self::$handbooks = []; 160 foreach ( $handbooks_config as $type => $conf ) { 161 self::$handbooks[ $type ] = new WPorg_Handbook( $type, $conf ); 22 162 } 23 163 164 // Enable glossary. 24 165 WPorg_Handbook_Glossary::init(); 25 166 26 add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_styles' ) ); 27 add_action( 'wp_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) ); 167 // Enqueue styles and scripts. 168 add_action( 'wp_enqueue_scripts', [ __CLASS__, 'enqueue_styles' ] ); 169 add_action( 'wp_enqueue_scripts', [ __CLASS__, 'enqueue_scripts' ] ); 170 171 /** 172 * Fires after handbooks have been initialized. 173 */ 174 do_action( 'after_handbooks_init' ); 28 175 } 29 176 30 static public function enqueue_styles() { 31 wp_enqueue_style( 'wporg-handbook-css', plugins_url( 'stylesheets/callout-boxes.css', WPORG_HANDBOOK_PLUGIN_FILE ), array(), '20200121' ); 177 /** 178 * Enqueues styles. 179 */ 180 public static function enqueue_styles() { 181 wp_enqueue_style( 'wporg-handbook-css', plugins_url( 'stylesheets/callout-boxes.css', WPORG_HANDBOOK_PLUGIN_FILE ), [], '20200121' ); 32 182 } 33 183 34 static public function enqueue_scripts() { 35 wp_enqueue_script( 'wporg-handbook', plugins_url( 'scripts/handbook.js', WPORG_HANDBOOK_PLUGIN_FILE ), array( 'jquery' ), '20150930' ); 184 /** 185 * Enqueues scripts. 186 */ 187 public static function enqueue_scripts() { 188 wp_enqueue_script( 'wporg-handbook', plugins_url( 'scripts/handbook.js', WPORG_HANDBOOK_PLUGIN_FILE ), [ 'jquery' ], '20150930' ); 36 189 } 37 190 38 191 } 39 192 40 add_action( 'after_setup_theme', array( 'WPorg_Handbook_Init', 'init' ) ); 41 193 add_action( 'after_setup_theme', [ 'WPorg_Handbook_Init', 'init' ] ); -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/table-of-contents.php
r10356 r10837 40 40 41 41 function load_filters() { 42 $this->post_types = array_map( array( $this, 'append_suffix' ), $this->post_types );43 44 42 if ( is_singular( $this->post_types ) && ! is_embed() ) { 45 43 add_filter( 'the_content', array( $this, 'add_toc' ) ); 46 44 } 47 }48 49 function append_suffix( $t ) {50 if ( in_array( $t, array( 'handbook', 'page' ) ) ) {51 return $t;52 }53 54 return $t . '-handbook';55 45 } 56 46 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/template-tags.php
r10356 r10837 6 6 * Wrapper function for WPorg_Handbook_Init::get_post_types(). 7 7 * 8 * @return array Array with full handbook post type names {post-type}-handbook.8 * @return array Array of handbook post types. 9 9 */ 10 10 function wporg_get_handbook_post_types() { … … 13 13 } 14 14 15 $post_types = WPorg_Handbook_Init::get_post_types(); 16 17 foreach ( $post_types as $key => $post_type ) { 18 if ( 'handbook' !== $post_type ) { 19 $post_types[ $key ] = $post_type . '-handbook'; 20 } 21 } 22 23 return $post_types; 15 return WPorg_Handbook_Init::get_post_types(); 24 16 } 25 17 … … 83 75 * @return bool True if the current page is the landing page for a handbook, false otherwise. 84 76 */ 85 function wporg_is_handbook_landing_page() { 86 return $GLOBALS['wp_query']->is_handbook_root; 77 function wporg_is_handbook_landing_page() { 78 return ( 79 $GLOBALS['wp_query']->is_handbook_root 80 || 81 ( 82 ! empty( $GLOBALS['wp_query']->query_vars['handbook'] ) 83 && 84 $GLOBALS['wp_query']->found_posts === 1 85 && 86 ! empty( $GLOBALS['wp_query']->query_vars['page_id'] ) 87 ) 88 ); 87 89 } 88 90 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/watchlist.php
r10356 r10837 1 1 <?php 2 /** 3 * Class providing P2/O2 watchlist functionality. 4 * 5 * @package handbook 6 */ 2 7 3 8 class WPorg_Handbook_Watchlist { 4 9 5 private static $post_types = array( 'handbook' ); 10 /** 11 * Memoized array of handbook post types. 12 * 13 * @var array 14 */ 15 private static $post_types; 6 16 17 /** 18 * Initializes actions. 19 */ 7 20 public static function init() { 8 add_action( 'init', array( __CLASS__, 'on_init' ) ); 9 } 10 11 public static function on_init() { 12 self::$post_types = (array) apply_filters( 'handbook_post_types', self::$post_types ); 13 self::$post_types = array_map( array( __CLASS__, 'append_suffix' ), self::$post_types ); 14 15 add_action( 'p2_action_links', array(__CLASS__, 'display_action_link'), 100 ); 16 add_filter( 'o2_filter_post_actions', array( __CLASS__, 'add_o2_action_link' ) ); 17 add_filter( 'o2_filter_post_action_html', array( __CLASS__, 'get_o2_action_link' ), 10, 2 ); 21 add_action( 'init', [ __CLASS__, 'on_init' ] ); 18 22 } 19 23 20 24 /** 21 * Appends '-handbook' to the dynamic post type, if not already 'handbook'. 22 * 23 * @param string $t Hanbook post type name. 24 * @return string 25 * Performs actions intended to occur during 'init' action. 25 26 */ 26 private static function append_suffix( $t ) { 27 if ( in_array( $t, array( 'handbook', 'page' ) ) ) { 28 return $t; 29 } 27 public static function on_init() { 28 self::$post_types = WPorg_Handbook_Init::get_post_types(); 30 29 31 return $t . '-handbook'; 30 self::o2_register_default_post_action_states(); 31 32 add_action( 'p2_action_links', [ __CLASS__, 'display_action_link' ], 100 ); 33 add_filter( 'o2_filter_post_actions', [ __CLASS__, 'add_o2_action_link' ] ); 34 add_filter( 'o2_filter_post_action_html', [ __CLASS__, 'get_o2_action_link' ], 10, 2 ); 32 35 } 33 36 34 37 /** 35 * Adds a 'Watch' action link to O2 38 * Returns default post action info. 39 * 40 * @param string $type The post action type. Either 'watch' or 'unwatch'. 41 * @return array 42 */ 43 protected static function get_default_post_action_info( $type ) { 44 $info = []; 45 46 if ( ! in_array( $type, [ 'unwatch', 'watch' ] ) ) { 47 return $info; 48 } 49 50 if ( 'watch' === $type ) { 51 $info = [ 52 'shortText' => __( 'Watch', 'wporg' ), 53 'title' => __( 'Get notified about changes to this page', 'wporg' ), 54 'genericon' => 'genericon-subscribe', 55 'classes' => [ 'genericon', 'genericon-subscribe' ], 56 'rel' => false, 57 ]; 58 } else { 59 $info = [ 60 'shortText' => __( 'Unwatch', 'wporg' ), 61 'title' => __( 'Stop getting notified about changes to this page', 'wporg' ), 62 'genericon' => 'genericon-unsubscribe', 63 'classes' => [ 'genericon', 'genericon-unsubscribe' ], 64 'rel' => false, 65 ]; 66 } 67 68 return $info; 69 } 70 71 /** 72 * Registers default post action states. 73 */ 74 public static function o2_register_default_post_action_states() { 75 if( ! function_exists( 'o2_register_post_action_states' ) ) { 76 return; 77 } 78 79 o2_register_post_action_states( 'watch', [ 80 'unwatch' => self::get_default_post_action_info( 'unwatch' ), 81 'watch' => self::get_default_post_action_info( 'watch' ), 82 ] ); 83 } 84 85 /** 86 * Adds a 'Watch' action link to O2. 87 * 88 * @param array $actions Array of O2 actions. 89 * @return array 36 90 */ 37 91 public static function add_o2_action_link( $actions ) { … … 45 99 } 46 100 47 if ( 'page' == $post->post_type || ( in_array( $post->post_type, self::$post_types ) && ! is_post_type_archive( self::$post_types )) ) {101 if ( in_array( $post->post_type, self::$post_types ) && ! is_post_type_archive( self::$post_types ) ) { 48 102 $watchlist = get_post_meta( $post->ID, '_wporg_watchlist', true ); 49 103 50 104 if ( $watchlist && in_array( get_current_user_id(), $watchlist ) ) { 51 $actions[35] = [105 $actions[35] = wp_parse_args( [ 52 106 'action' => 'watch', 53 'text' => __( 'Unwatch', 'wporg' ),54 107 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=wporg_watchlist&post_id=' . $post->ID ), 'unwatch-' . $post->ID ), 55 'title' => __( 'Stop getting notified about changes to this page', 'wporg' ), 56 'classes' => [ 'genericon', 'genericon-unsubscribe' ], 57 ]; 108 'initialState' => 'unwatch', 109 ], self::get_default_post_action_info( 'unwatch' ) ); 58 110 } else { 59 $actions[35] = [111 $actions[35] = wp_parse_args( [ 60 112 'action' => 'watch', 61 'text' => __( 'Watch', 'wporg' ),62 113 'href' => wp_nonce_url( admin_url( 'admin-post.php?action=wporg_watchlist&watch=1&post_id=' . $post->ID ), 'watch-' . $post->ID ), 63 'title' => __( 'Get notified about changes to this page', 'wporg' ), 64 'classes' => [ 'genericon', 'genericon-subscribe' ], 65 ]; 114 'initialState' => 'watch', 115 ], self::get_default_post_action_info( 'watch' ) ); 66 116 } 67 117 } 118 68 119 return $actions; 69 120 } 70 121 71 122 /** 72 * Create the HTML for the watch o2 post action. 123 * Returns the HTML for the watch o2 post action. 124 * 125 * @param string $html The HTML for the given action. 126 * @param array $action Data about the action. 127 * @return string 73 128 */ 74 129 public static function get_o2_action_link( $html, $action ) { … … 79 134 $action['title'], 80 135 implode( ' ', $action['classes'] ), 81 $action[' text']136 $action['shortText'] 82 137 ); 83 138 } … … 87 142 88 143 /** 89 * Adds a 'Watch' action link to P2144 * Outputs a 'Watch' action link to P2. 90 145 */ 91 146 public static function display_action_link() { 92 93 147 if ( ! is_user_logged_in() ) { 94 148 return; … … 96 150 97 151 $post = get_post(); 152 if ( ! $post ) { 153 return; 154 } 98 155 99 if ( 'page' == $post->post_type || ( in_array( $post->post_type, self::$post_types ) && ! is_post_type_archive( self::$post_types ) ) ) { 100 156 if ( in_array( $post->post_type, self::$post_types ) && ! is_post_type_archive( self::$post_types ) ) { 101 157 $watchlist = get_post_meta( $post->ID, '_wporg_watchlist', true ); 102 158 … … 116 172 ); 117 173 } 118 119 174 } 120 121 175 } 122 176 … … 124 178 125 179 WPorg_Handbook_Watchlist::init(); 126 -
sites/trunk/wordpress.org/public_html/wp-content/plugins/handbook/inc/widgets.php
r10356 r10837 11 11 protected static $widget_id_base = 'handbook_pages'; 12 12 13 protected $post_types = array( 'handbook' );13 protected $post_types; 14 14 15 15 /** … … 72 72 } 73 73 74 $this->post_types = (array) apply_filters( 'handbook_post_types', $this->post_types ); 75 $this->post_types = array_map( array( $this, 'append_suffix' ), $this->post_types ); 74 $this->post_types = WPorg_Handbook_Init::get_post_types(); 76 75 77 76 $post_type = ''; … … 94 93 95 94 // Exclude root handbook page from the table of contents. 96 $page = get_page_by_path( $ this->append_suffix( $post_type ), OBJECT, $post_type );95 $page = get_page_by_path( $post_type, OBJECT, $post_type ); 97 96 if ( ! $page ) { 98 $slug = s ubstr( $post_type, 0, -9);97 $slug = str_replace( '-handbook', '', $post_type ); 99 98 $page = get_page_by_path( $slug, OBJECT, $post_type ); 100 99 } … … 108 107 109 108 return $args; 110 }111 112 public function append_suffix( $t ) {113 if ( in_array( $t, array( 'handbook', 'page' ) ) ) {114 return $t;115 }116 117 return $t . '-handbook';118 109 } 119 110
Note: See TracChangeset
for help on using the changeset viewer.