PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.0-beta
Jetpack – WP Security, Backup, Speed, & Growth v16.0-beta
16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / seo-tools / class-jetpack-seo-admin-columns.php
jetpack / modules / seo-tools Last commit date
class-jetpack-seo-admin-columns.php 1 week ago class-jetpack-seo-posts.php 1 week ago class-jetpack-seo-titles.php 3 years ago class-jetpack-seo-utils.php 7 months ago class-jetpack-seo.php 1 month ago
class-jetpack-seo-admin-columns.php
171 lines
1 <?php
2 /**
3 * Adds factual SEO columns to wp-admin post list tables.
4 *
5 * Surfaces the per-post SEO *state* at a glance — schema type, whether a meta
6 * description is set, and search visibility — without grading it. Whether a
7 * given setting should be configured depends on the post's purpose, so we
8 * report facts and let the author decide.
9 *
10 * @package automattic/jetpack
11 */
12
13 /**
14 * Registers read-only SEO columns on every public post-list table.
15 */
16 class Jetpack_SEO_Admin_Columns {
17
18 /**
19 * Wire all hooks.
20 *
21 * @return void
22 */
23 public static function init() {
24 add_action( 'admin_init', array( __CLASS__, 'register_columns_for_post_types' ) );
25 add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_assets' ) );
26 add_filter( 'default_hidden_columns', array( __CLASS__, 'default_hidden_columns' ), 10, 2 );
27 }
28
29 /**
30 * Hide the SEO columns by default in Screen Options.
31 *
32 * Three extra always-on columns squeeze the title column unreadably narrow,
33 * so we default them to hidden using core's `default_hidden_columns` filter —
34 * the standard mechanism for choosing which columns start hidden in Screen
35 * Options. It only applies to users who have never customized Screen Options
36 * for the screen, so anyone who explicitly enabled the columns keeps them.
37 *
38 * @param string[] $hidden Column IDs hidden by default.
39 * @param WP_Screen $screen Current screen.
40 * @return string[]
41 */
42 public static function default_hidden_columns( $hidden, $screen ) {
43 if ( isset( $screen->base ) && 'edit' === $screen->base ) {
44 $hidden = array_merge(
45 $hidden,
46 array( 'jetpack_seo_schema', 'jetpack_seo_description', 'jetpack_seo_search' )
47 );
48 }
49 return $hidden;
50 }
51
52 /**
53 * Register columns + renderers for each public, visible post type.
54 *
55 * @return void
56 */
57 public static function register_columns_for_post_types() {
58 $post_types = get_post_types(
59 array(
60 'public' => true,
61 'show_ui' => true,
62 'show_in_rest' => true,
63 ),
64 'names'
65 );
66 unset( $post_types['attachment'] );
67
68 foreach ( $post_types as $post_type ) {
69 add_filter( "manage_{$post_type}_posts_columns", array( __CLASS__, 'add_columns' ) );
70 add_action( "manage_{$post_type}_posts_custom_column", array( __CLASS__, 'render_column' ), 10, 2 );
71 }
72 }
73
74 /**
75 * Insert the SEO columns just after the title column.
76 *
77 * @param array $columns Existing columns keyed by column name.
78 * @return array
79 */
80 public static function add_columns( $columns ) {
81 $new = array();
82 foreach ( $columns as $key => $label ) {
83 $new[ $key ] = $label;
84 if ( 'title' === $key ) {
85 $new['jetpack_seo_schema'] = __( 'Schema', 'jetpack' );
86 $new['jetpack_seo_description'] = __( 'Meta description', 'jetpack' );
87 $new['jetpack_seo_search'] = __( 'Search', 'jetpack' );
88 }
89 }
90 return $new;
91 }
92
93 /**
94 * Render a single cell — factual state only.
95 *
96 * @param string $column Column identifier.
97 * @param int $post_id Current row post ID.
98 * @return void
99 */
100 public static function render_column( $column, $post_id ) {
101 $columns = array( 'jetpack_seo_schema', 'jetpack_seo_description', 'jetpack_seo_search' );
102 if ( ! in_array( $column, $columns, true ) ) {
103 return;
104 }
105
106 $coverage = Jetpack_SEO_Posts::get_post_seo_coverage( $post_id );
107
108 switch ( $column ) {
109 case 'jetpack_seo_schema':
110 $schema = Jetpack_SEO_Posts::get_post_schema_type( $post_id );
111 echo esc_html( '' !== $schema ? self::schema_type_label( $schema ) : '' );
112 break;
113
114 case 'jetpack_seo_description':
115 // wp_kses_post() sanitizes the markup and signals the escaping to PHPCS;
116 // the muted branch wraps its (already-escaped) label in a <span>.
117 echo wp_kses_post(
118 $coverage['has_description']
119 ? esc_html__( 'Set', 'jetpack' )
120 : '<span class="jetpack-seo-col-muted">' . esc_html__( 'Not set', 'jetpack' ) . '</span>'
121 );
122 break;
123
124 case 'jetpack_seo_search':
125 echo wp_kses_post(
126 $coverage['noindex']
127 ? esc_html__( 'Hidden', 'jetpack' )
128 : '<span class="jetpack-seo-col-muted">' . esc_html__( 'Visible', 'jetpack' ) . '</span>'
129 );
130 break;
131 }
132 }
133
134 /**
135 * Display label for an allowed schema type.
136 *
137 * @param string $schema Schema type slug.
138 * @return string
139 */
140 private static function schema_type_label( $schema ) {
141 switch ( $schema ) {
142 case 'article':
143 return __( 'Article', 'jetpack' );
144 case 'faq':
145 return __( 'FAQ', 'jetpack' );
146 default:
147 return ucfirst( $schema );
148 }
149 }
150
151 /**
152 * Minimal column-width styling on edit.php only (no color-coding —
153 * these columns report state, not a grade).
154 *
155 * @param string $hook_suffix Current admin hook suffix.
156 * @return void
157 */
158 public static function enqueue_assets( $hook_suffix ) {
159 if ( 'edit.php' !== $hook_suffix ) {
160 return;
161 }
162 wp_register_style( 'jetpack-seo-admin-columns', false, array(), JETPACK__VERSION );
163 wp_add_inline_style(
164 'jetpack-seo-admin-columns',
165 '.column-jetpack_seo_schema,.column-jetpack_seo_description,.column-jetpack_seo_search{width:9em}' .
166 '.jetpack-seo-col-muted{color:#787c82}'
167 );
168 wp_enqueue_style( 'jetpack-seo-admin-columns' );
169 }
170 }
171