Version Description
- Security: Resolve XSS issue by improving sanitization when saving subtitle custom field.
- Pass the current post object to the
wps_subtitle_field_placeholderfilter. Props Dominik Schilling.
Download this release
Release Info
| Developer | husobj |
| Plugin | |
| Version | 3.4.1 |
| Comparing to | |
| See all releases | |
Code changes from version 3.4 to 3.4.1
- CHANGELOG.md +8 -0
- README.md +3 -0
- plugin/admin/admin.php +46 -39
- plugin/admin/js/admin-edit.js +2 -2
- plugin/admin/js/pointers.js +23 -16
- plugin/admin/pointers.php +12 -11
- plugin/includes/class-api.php +16 -11
- plugin/includes/compat/seopress.php +5 -5
- plugin/includes/compat/woocommerce.php +26 -21
- plugin/includes/compat/wordpress-seo.php +5 -5
- plugin/includes/deprecated.php +34 -21
- plugin/includes/rest.php +14 -10
- plugin/includes/shortcode.php +25 -19
- plugin/includes/subtitle.php +33 -25
- plugin/plugin.php +25 -23
- readme.txt +9 -2
- wp-subtitle.php +2 -2
CHANGELOG.md
CHANGED
|
@@ -2,8 +2,16 @@
|
|
| 2 |
All notable changes to this project will be documented in this file.
|
| 3 |
This project adheres to [Semantic Versioning](http://semver.org/).
|
| 4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
## [3.4] - 2020-01-31
|
| 6 |
|
|
|
|
|
|
|
|
|
|
| 7 |
### Added
|
| 8 |
- Added support for the SEOPress plugin. Props @chriselkins.
|
| 9 |
- You can now update the subtitle via the REST API. Props @chriselkins.
|
| 2 |
All notable changes to this project will be documented in this file.
|
| 3 |
This project adheres to [Semantic Versioning](http://semver.org/).
|
| 4 |
|
| 5 |
+
## [3.4.1] - 2022-04-21
|
| 6 |
+
|
| 7 |
+
### Security
|
| 8 |
+
- Resolve XSS issue by improving sanitization when saving subtitle custom field.
|
| 9 |
+
|
| 10 |
## [3.4] - 2020-01-31
|
| 11 |
|
| 12 |
+
### Changed
|
| 13 |
+
- Pass the current post object to the `wps_subtitle_field_placeholder` filter. Props [Dominik Schilling](https://github.com/ocean90).
|
| 14 |
+
|
| 15 |
### Added
|
| 16 |
- Added support for the SEOPress plugin. Props @chriselkins.
|
| 17 |
- You can now update the subtitle via the REST API. Props @chriselkins.
|
README.md
CHANGED
|
@@ -140,6 +140,9 @@ The plugin is [hosted on GitHub](https://github.com/benhuson/wp-subtitle) and pu
|
|
| 140 |
Upgrade Notice
|
| 141 |
--------------
|
| 142 |
|
|
|
|
|
|
|
|
|
|
| 143 |
### 3.4
|
| 144 |
Added support for the SEOPress plugin and updating the subtitle via the REST API.
|
| 145 |
|
| 140 |
Upgrade Notice
|
| 141 |
--------------
|
| 142 |
|
| 143 |
+
### 3.4.1
|
| 144 |
+
Resolve XSS issue by improving sanitization when saving subtitle custom field.
|
| 145 |
+
|
| 146 |
### 3.4
|
| 147 |
Added support for the SEOPress plugin and updating the subtitle via the REST API.
|
| 148 |
|
plugin/admin/admin.php
CHANGED
|
@@ -28,6 +28,8 @@ class WPSubtitle_Admin {
|
|
| 28 |
add_filter( '_wp_post_revision_fields', array( 'WPSubtitle_Admin', '_wp_post_revision_fields' ), 9 );
|
| 29 |
add_action( 'wp_restore_post_revision', array( 'WPSubtitle_Admin', 'wp_restore_post_revision' ), 10, 2 );
|
| 30 |
|
|
|
|
|
|
|
| 31 |
}
|
| 32 |
|
| 33 |
/**
|
|
@@ -45,10 +47,10 @@ class WPSubtitle_Admin {
|
|
| 45 |
|
| 46 |
$position = self::subtitle_field_position( $post_type );
|
| 47 |
|
| 48 |
-
if ( 'after_title'
|
| 49 |
add_action( 'admin_head', array( 'WPSubtitle_Admin', '_add_admin_styles' ) );
|
| 50 |
add_action( 'edit_form_after_title', array( 'WPSubtitle_Admin', '_add_subtitle_field' ) );
|
| 51 |
-
} elseif ( 'before_title'
|
| 52 |
add_action( 'admin_head', array( 'WPSubtitle_Admin', '_add_admin_styles' ) );
|
| 53 |
add_action( 'edit_form_top', array( 'WPSubtitle_Admin', '_add_subtitle_field' ) );
|
| 54 |
} else {
|
|
@@ -73,10 +75,10 @@ class WPSubtitle_Admin {
|
|
| 73 |
global $pagenow;
|
| 74 |
|
| 75 |
if ( isset( $_REQUEST['post_type'] ) ) {
|
| 76 |
-
return sanitize_text_field( $_REQUEST['post_type'] );
|
| 77 |
} elseif ( isset( $_GET['post'] ) ) {
|
| 78 |
return get_post_type( absint( $_GET['post'] ) );
|
| 79 |
-
} elseif ( in_array( $pagenow, array( 'post-new.php', 'edit.php' ) ) ) {
|
| 80 |
return 'post';
|
| 81 |
}
|
| 82 |
|
|
@@ -91,12 +93,12 @@ class WPSubtitle_Admin {
|
|
| 91 |
*
|
| 92 |
* @uses add_action( 'quick_edit_custom_box' )
|
| 93 |
*
|
| 94 |
-
* @param string
|
| 95 |
-
* @param string
|
| 96 |
*/
|
| 97 |
public static function quick_edit_custom_box( $column_name, $post_type ) {
|
| 98 |
|
| 99 |
-
if (
|
| 100 |
return;
|
| 101 |
}
|
| 102 |
|
|
@@ -104,7 +106,7 @@ class WPSubtitle_Admin {
|
|
| 104 |
|
| 105 |
?>
|
| 106 |
<fieldset class="inline-edit-col-left inline-edit-col-left-wps-subtitle">
|
| 107 |
-
<div class="inline-edit-col column
|
| 108 |
<label>
|
| 109 |
<span class="title"><?php esc_html_e( 'Subtitle', 'wp-subtitle' ); ?></span>
|
| 110 |
<span class="input-text-wrap"><input type="text" name="wps_subtitle" class="wps_subtitle" value=""></span>
|
|
@@ -120,7 +122,7 @@ class WPSubtitle_Admin {
|
|
| 120 |
*
|
| 121 |
* @since 2.4
|
| 122 |
*
|
| 123 |
-
* @param array
|
| 124 |
* @return array Updated columns.
|
| 125 |
*/
|
| 126 |
public static function manage_subtitle_columns( $columns ) {
|
|
@@ -146,7 +148,7 @@ class WPSubtitle_Admin {
|
|
| 146 |
// Insert column
|
| 147 |
foreach ( $columns as $column => $value ) {
|
| 148 |
$new_columns[ $column ] = $value;
|
| 149 |
-
if ( $after_column
|
| 150 |
$new_columns['wps_subtitle'] = $column_name;
|
| 151 |
}
|
| 152 |
}
|
|
@@ -160,12 +162,12 @@ class WPSubtitle_Admin {
|
|
| 160 |
*
|
| 161 |
* @since 2.4
|
| 162 |
*
|
| 163 |
-
* @param string
|
| 164 |
-
* @param int
|
| 165 |
*/
|
| 166 |
public static function manage_subtitle_columns_content( $column_name, $post_id ) {
|
| 167 |
|
| 168 |
-
if (
|
| 169 |
|
| 170 |
$subtitle = new WP_Subtitle( $post_id );
|
| 171 |
echo '<span data-wps_subtitle="' . esc_attr( $subtitle->get_subtitle() ) . '">' . esc_html( $subtitle->get_subtitle() ) . '</span>';
|
|
@@ -182,11 +184,11 @@ class WPSubtitle_Admin {
|
|
| 182 |
*/
|
| 183 |
public static function _add_admin_scripts( $hook ) {
|
| 184 |
|
| 185 |
-
if ( 'edit.php'
|
| 186 |
return;
|
| 187 |
}
|
| 188 |
|
| 189 |
-
wp_enqueue_script( 'wps_subtitle', plugins_url( 'js/admin-edit.js', __FILE__ ), false,
|
| 190 |
|
| 191 |
}
|
| 192 |
|
|
@@ -196,7 +198,7 @@ class WPSubtitle_Admin {
|
|
| 196 |
* @since 2.9
|
| 197 |
* @internal
|
| 198 |
*
|
| 199 |
-
* @param array
|
| 200 |
*/
|
| 201 |
public static function _wp_post_revision_fields( $fields ) {
|
| 202 |
|
|
@@ -211,8 +213,8 @@ class WPSubtitle_Admin {
|
|
| 211 |
*
|
| 212 |
* @since 2.9
|
| 213 |
*
|
| 214 |
-
* @param int
|
| 215 |
-
* @param int
|
| 216 |
*/
|
| 217 |
public static function wp_restore_post_revision( $post_id, $revision_id ) {
|
| 218 |
|
|
@@ -290,7 +292,7 @@ class WPSubtitle_Admin {
|
|
| 290 |
|
| 291 |
$positiom = self::gutenberg_supported( $post_type ) ? 'side' : 'normal';
|
| 292 |
|
| 293 |
-
add_meta_box( 'wps_subtitle_panel',
|
| 294 |
|
| 295 |
}
|
| 296 |
}
|
|
@@ -310,13 +312,13 @@ class WPSubtitle_Admin {
|
|
| 310 |
|
| 311 |
$value = self::get_admin_subtitle_value( $post );
|
| 312 |
|
| 313 |
-
echo '<input type="hidden" name="wps_noncename" id="wps_noncename" value="' . wp_create_nonce( 'wp-subtitle' ) . '" />';
|
| 314 |
|
| 315 |
// As of WordPress 4.3 no need to esc_attr() AND htmlentities().
|
| 316 |
// @see https://core.trac.wordpress.org/changeset/33271
|
| 317 |
-
echo '<input type="text" id="wpsubtitle" name="wps_subtitle" value="' . esc_attr( $value ) . '" autocomplete="off" placeholder="' . esc_attr( apply_filters( 'wps_subtitle_field_placeholder', __( 'Enter subtitle here', 'wp-subtitle' ) ) ) . '" style="width:99%;" />';
|
| 318 |
|
| 319 |
-
echo apply_filters( 'wps_subtitle_field_description', '', $post );
|
| 320 |
|
| 321 |
}
|
| 322 |
|
|
@@ -335,20 +337,20 @@ class WPSubtitle_Admin {
|
|
| 335 |
|
| 336 |
$value = self::get_admin_subtitle_value( $post );
|
| 337 |
|
| 338 |
-
echo '<input type="hidden" name="wps_noncename" id="wps_noncename" value="' . wp_create_nonce( 'wp-subtitle' ) . '" />';
|
| 339 |
echo '<div id="subtitlediv" class="top">';
|
| 340 |
echo '<div id="subtitlewrap">';
|
| 341 |
|
| 342 |
// As of WordPress 4.3 no need to esc_attr() AND htmlentities().
|
| 343 |
// @see https://core.trac.wordpress.org/changeset/33271
|
| 344 |
-
echo '<input type="text" id="wpsubtitle" name="wps_subtitle" value="' . esc_attr( $value ) . '" autocomplete="off" placeholder="' . esc_attr( apply_filters( 'wps_subtitle_field_placeholder', __( 'Enter subtitle here', 'wp-subtitle' ) ) ) . '" />';
|
| 345 |
|
| 346 |
echo '</div>';
|
| 347 |
|
| 348 |
// Description
|
| 349 |
$description = apply_filters( 'wps_subtitle_field_description', '', $post );
|
| 350 |
if ( ! empty( $description ) ) {
|
| 351 |
-
echo '<div id="subtitledescription">' . $description . '</div>';
|
| 352 |
}
|
| 353 |
echo '</div>';
|
| 354 |
}
|
|
@@ -359,7 +361,7 @@ class WPSubtitle_Admin {
|
|
| 359 |
* @since 2.8
|
| 360 |
* @internal
|
| 361 |
*
|
| 362 |
-
* @param WP_Post
|
| 363 |
* @return string Subtitle value.
|
| 364 |
*/
|
| 365 |
private static function get_admin_subtitle_value( $post ) {
|
|
@@ -371,7 +373,7 @@ class WPSubtitle_Admin {
|
|
| 371 |
// Default subtitle if adding new post
|
| 372 |
if ( function_exists( 'get_current_screen' ) && empty( $value ) ) {
|
| 373 |
$screen = get_current_screen();
|
| 374 |
-
if ( isset( $screen->action ) && 'add'
|
| 375 |
$value = $subtitle->get_default_subtitle( $post );
|
| 376 |
}
|
| 377 |
}
|
|
@@ -388,11 +390,11 @@ class WPSubtitle_Admin {
|
|
| 388 |
*
|
| 389 |
* @uses WPSubtitle::get_supported_post_types()
|
| 390 |
*
|
| 391 |
-
* @param int
|
| 392 |
*/
|
| 393 |
public static function _save_post( $post_id ) {
|
| 394 |
|
| 395 |
-
// Verify if this is an auto save routine.
|
| 396 |
// If it is our form has not been submitted, so we dont want to do anything
|
| 397 |
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
| 398 |
return;
|
|
@@ -406,7 +408,7 @@ class WPSubtitle_Admin {
|
|
| 406 |
// Check data and save
|
| 407 |
if ( isset( $_POST['wps_subtitle'] ) ) {
|
| 408 |
|
| 409 |
-
$new_value = wp_kses_post( $_POST['wps_subtitle'] );
|
| 410 |
|
| 411 |
$subtitle = new WP_Subtitle( $post_id );
|
| 412 |
|
|
@@ -418,7 +420,6 @@ class WPSubtitle_Admin {
|
|
| 418 |
if ( $subtitle->current_user_can_edit() ) {
|
| 419 |
$subtitle->update_subtitle( $new_value );
|
| 420 |
}
|
| 421 |
-
|
| 422 |
}
|
| 423 |
|
| 424 |
}
|
|
@@ -430,7 +431,7 @@ class WPSubtitle_Admin {
|
|
| 430 |
* @deprecated 2.7 Use WP_Subtitle->current_user_can_edit() instead.
|
| 431 |
* @internal
|
| 432 |
*
|
| 433 |
-
* @param int
|
| 434 |
* @return bool
|
| 435 |
*/
|
| 436 |
private static function _verify_post_edit_capability( $post_id ) {
|
|
@@ -449,12 +450,12 @@ class WPSubtitle_Admin {
|
|
| 449 |
* @since 2.0.1
|
| 450 |
* @internal
|
| 451 |
*
|
| 452 |
-
* @param string
|
| 453 |
-
* @param string
|
| 454 |
* @return bool
|
| 455 |
*/
|
| 456 |
private static function _verify_posted_nonce( $nonce, $action ) {
|
| 457 |
-
if ( isset( $_POST[ $nonce ] ) && wp_verify_nonce( $_POST[ $nonce ], $action ) ) {
|
| 458 |
return true;
|
| 459 |
}
|
| 460 |
return false;
|
|
@@ -465,7 +466,7 @@ class WPSubtitle_Admin {
|
|
| 465 |
*
|
| 466 |
* @since 2.2
|
| 467 |
*
|
| 468 |
-
* @param string
|
| 469 |
* @return bool
|
| 470 |
*/
|
| 471 |
private static function edit_form_after_title_supported( $post_type = '' ) {
|
|
@@ -482,7 +483,7 @@ class WPSubtitle_Admin {
|
|
| 482 |
*
|
| 483 |
* @since 3.1
|
| 484 |
*
|
| 485 |
-
* @param string
|
| 486 |
* @return bool
|
| 487 |
*/
|
| 488 |
private static function gutenberg_supported( $post_type = '' ) {
|
|
@@ -500,8 +501,8 @@ class WPSubtitle_Admin {
|
|
| 500 |
*
|
| 501 |
* @since 3.1
|
| 502 |
*
|
| 503 |
-
* @param
|
| 504 |
-
* @
|
| 505 |
*/
|
| 506 |
private static function subtitle_field_position( $post_type = '' ) {
|
| 507 |
|
|
@@ -519,4 +520,10 @@ class WPSubtitle_Admin {
|
|
| 519 |
|
| 520 |
}
|
| 521 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 522 |
}
|
| 28 |
add_filter( '_wp_post_revision_fields', array( 'WPSubtitle_Admin', '_wp_post_revision_fields' ), 9 );
|
| 29 |
add_action( 'wp_restore_post_revision', array( 'WPSubtitle_Admin', 'wp_restore_post_revision' ), 10, 2 );
|
| 30 |
|
| 31 |
+
add_filter( 'sanitize_post_meta_wps_subtitle', array( 'WPSubtitle_Admin', 'sanitize_subtitle_value' ) );
|
| 32 |
+
|
| 33 |
}
|
| 34 |
|
| 35 |
/**
|
| 47 |
|
| 48 |
$position = self::subtitle_field_position( $post_type );
|
| 49 |
|
| 50 |
+
if ( 'after_title' === $position ) {
|
| 51 |
add_action( 'admin_head', array( 'WPSubtitle_Admin', '_add_admin_styles' ) );
|
| 52 |
add_action( 'edit_form_after_title', array( 'WPSubtitle_Admin', '_add_subtitle_field' ) );
|
| 53 |
+
} elseif ( 'before_title' === $position ) {
|
| 54 |
add_action( 'admin_head', array( 'WPSubtitle_Admin', '_add_admin_styles' ) );
|
| 55 |
add_action( 'edit_form_top', array( 'WPSubtitle_Admin', '_add_subtitle_field' ) );
|
| 56 |
} else {
|
| 75 |
global $pagenow;
|
| 76 |
|
| 77 |
if ( isset( $_REQUEST['post_type'] ) ) {
|
| 78 |
+
return sanitize_text_field( wp_unslash( $_REQUEST['post_type'] ) );
|
| 79 |
} elseif ( isset( $_GET['post'] ) ) {
|
| 80 |
return get_post_type( absint( $_GET['post'] ) );
|
| 81 |
+
} elseif ( in_array( $pagenow, array( 'post-new.php', 'edit.php' ), true ) ) {
|
| 82 |
return 'post';
|
| 83 |
}
|
| 84 |
|
| 93 |
*
|
| 94 |
* @uses add_action( 'quick_edit_custom_box' )
|
| 95 |
*
|
| 96 |
+
* @param string $column_name Column name.
|
| 97 |
+
* @param string $post_type Post type
|
| 98 |
*/
|
| 99 |
public static function quick_edit_custom_box( $column_name, $post_type ) {
|
| 100 |
|
| 101 |
+
if ( 'wps_subtitle' !== $column_name ) {
|
| 102 |
return;
|
| 103 |
}
|
| 104 |
|
| 106 |
|
| 107 |
?>
|
| 108 |
<fieldset class="inline-edit-col-left inline-edit-col-left-wps-subtitle">
|
| 109 |
+
<div class="inline-edit-col column-wps_subtitle">
|
| 110 |
<label>
|
| 111 |
<span class="title"><?php esc_html_e( 'Subtitle', 'wp-subtitle' ); ?></span>
|
| 112 |
<span class="input-text-wrap"><input type="text" name="wps_subtitle" class="wps_subtitle" value=""></span>
|
| 122 |
*
|
| 123 |
* @since 2.4
|
| 124 |
*
|
| 125 |
+
* @param array $columns A columns
|
| 126 |
* @return array Updated columns.
|
| 127 |
*/
|
| 128 |
public static function manage_subtitle_columns( $columns ) {
|
| 148 |
// Insert column
|
| 149 |
foreach ( $columns as $column => $value ) {
|
| 150 |
$new_columns[ $column ] = $value;
|
| 151 |
+
if ( $after_column === $column ) {
|
| 152 |
$new_columns['wps_subtitle'] = $column_name;
|
| 153 |
}
|
| 154 |
}
|
| 162 |
*
|
| 163 |
* @since 2.4
|
| 164 |
*
|
| 165 |
+
* @param string $column_name Column name.
|
| 166 |
+
* @param int $post_id Post ID
|
| 167 |
*/
|
| 168 |
public static function manage_subtitle_columns_content( $column_name, $post_id ) {
|
| 169 |
|
| 170 |
+
if ( 'wps_subtitle' === $column_name ) {
|
| 171 |
|
| 172 |
$subtitle = new WP_Subtitle( $post_id );
|
| 173 |
echo '<span data-wps_subtitle="' . esc_attr( $subtitle->get_subtitle() ) . '">' . esc_html( $subtitle->get_subtitle() ) . '</span>';
|
| 184 |
*/
|
| 185 |
public static function _add_admin_scripts( $hook ) {
|
| 186 |
|
| 187 |
+
if ( 'edit.php' !== $hook ) {
|
| 188 |
return;
|
| 189 |
}
|
| 190 |
|
| 191 |
+
wp_enqueue_script( 'wps_subtitle', plugins_url( 'js/admin-edit.js', __FILE__ ), false, '3.4.1', true );
|
| 192 |
|
| 193 |
}
|
| 194 |
|
| 198 |
* @since 2.9
|
| 199 |
* @internal
|
| 200 |
*
|
| 201 |
+
* @param array $fields Revision fields.
|
| 202 |
*/
|
| 203 |
public static function _wp_post_revision_fields( $fields ) {
|
| 204 |
|
| 213 |
*
|
| 214 |
* @since 2.9
|
| 215 |
*
|
| 216 |
+
* @param int $post_id Post ID.
|
| 217 |
+
* @param int $revision_id Revision ID.
|
| 218 |
*/
|
| 219 |
public static function wp_restore_post_revision( $post_id, $revision_id ) {
|
| 220 |
|
| 292 |
|
| 293 |
$positiom = self::gutenberg_supported( $post_type ) ? 'side' : 'normal';
|
| 294 |
|
| 295 |
+
add_meta_box( 'wps_subtitle_panel', self::get_meta_box_title( $post_type ), array( 'WPSubtitle_Admin', '_add_subtitle_meta_box' ), $post_type, $positiom, 'high' );
|
| 296 |
|
| 297 |
}
|
| 298 |
}
|
| 312 |
|
| 313 |
$value = self::get_admin_subtitle_value( $post );
|
| 314 |
|
| 315 |
+
echo '<input type="hidden" name="wps_noncename" id="wps_noncename" value="' . esc_attr( wp_create_nonce( 'wp-subtitle' ) ) . '" />';
|
| 316 |
|
| 317 |
// As of WordPress 4.3 no need to esc_attr() AND htmlentities().
|
| 318 |
// @see https://core.trac.wordpress.org/changeset/33271
|
| 319 |
+
echo '<input type="text" id="wpsubtitle" name="wps_subtitle" value="' . esc_attr( $value ) . '" autocomplete="off" placeholder="' . esc_attr( apply_filters( 'wps_subtitle_field_placeholder', __( 'Enter subtitle here', 'wp-subtitle' ), $post ) ) . '" style="width:99%;" />';
|
| 320 |
|
| 321 |
+
echo wp_kses_post( apply_filters( 'wps_subtitle_field_description', '', $post ) );
|
| 322 |
|
| 323 |
}
|
| 324 |
|
| 337 |
|
| 338 |
$value = self::get_admin_subtitle_value( $post );
|
| 339 |
|
| 340 |
+
echo '<input type="hidden" name="wps_noncename" id="wps_noncename" value="' . esc_attr( wp_create_nonce( 'wp-subtitle' ) ) . '" />';
|
| 341 |
echo '<div id="subtitlediv" class="top">';
|
| 342 |
echo '<div id="subtitlewrap">';
|
| 343 |
|
| 344 |
// As of WordPress 4.3 no need to esc_attr() AND htmlentities().
|
| 345 |
// @see https://core.trac.wordpress.org/changeset/33271
|
| 346 |
+
echo '<input type="text" id="wpsubtitle" name="wps_subtitle" value="' . esc_attr( $value ) . '" autocomplete="off" placeholder="' . esc_attr( apply_filters( 'wps_subtitle_field_placeholder', __( 'Enter subtitle here', 'wp-subtitle' ), $post ) ) . '" />';
|
| 347 |
|
| 348 |
echo '</div>';
|
| 349 |
|
| 350 |
// Description
|
| 351 |
$description = apply_filters( 'wps_subtitle_field_description', '', $post );
|
| 352 |
if ( ! empty( $description ) ) {
|
| 353 |
+
echo '<div id="subtitledescription">' . wp_kses_post( $description ) . '</div>';
|
| 354 |
}
|
| 355 |
echo '</div>';
|
| 356 |
}
|
| 361 |
* @since 2.8
|
| 362 |
* @internal
|
| 363 |
*
|
| 364 |
+
* @param WP_Post $post Post object.
|
| 365 |
* @return string Subtitle value.
|
| 366 |
*/
|
| 367 |
private static function get_admin_subtitle_value( $post ) {
|
| 373 |
// Default subtitle if adding new post
|
| 374 |
if ( function_exists( 'get_current_screen' ) && empty( $value ) ) {
|
| 375 |
$screen = get_current_screen();
|
| 376 |
+
if ( isset( $screen->action ) && 'add' === $screen->action ) {
|
| 377 |
$value = $subtitle->get_default_subtitle( $post );
|
| 378 |
}
|
| 379 |
}
|
| 390 |
*
|
| 391 |
* @uses WPSubtitle::get_supported_post_types()
|
| 392 |
*
|
| 393 |
+
* @param int $post_id Post ID or object.
|
| 394 |
*/
|
| 395 |
public static function _save_post( $post_id ) {
|
| 396 |
|
| 397 |
+
// Verify if this is an auto save routine.
|
| 398 |
// If it is our form has not been submitted, so we dont want to do anything
|
| 399 |
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) {
|
| 400 |
return;
|
| 408 |
// Check data and save
|
| 409 |
if ( isset( $_POST['wps_subtitle'] ) ) {
|
| 410 |
|
| 411 |
+
$new_value = wp_kses_post( wp_unslash( $_POST['wps_subtitle'] ) );
|
| 412 |
|
| 413 |
$subtitle = new WP_Subtitle( $post_id );
|
| 414 |
|
| 420 |
if ( $subtitle->current_user_can_edit() ) {
|
| 421 |
$subtitle->update_subtitle( $new_value );
|
| 422 |
}
|
|
|
|
| 423 |
}
|
| 424 |
|
| 425 |
}
|
| 431 |
* @deprecated 2.7 Use WP_Subtitle->current_user_can_edit() instead.
|
| 432 |
* @internal
|
| 433 |
*
|
| 434 |
+
* @param int $post_id Post ID.
|
| 435 |
* @return bool
|
| 436 |
*/
|
| 437 |
private static function _verify_post_edit_capability( $post_id ) {
|
| 450 |
* @since 2.0.1
|
| 451 |
* @internal
|
| 452 |
*
|
| 453 |
+
* @param string $nonce Posted nonce name.
|
| 454 |
+
* @param string $action Nonce action.
|
| 455 |
* @return bool
|
| 456 |
*/
|
| 457 |
private static function _verify_posted_nonce( $nonce, $action ) {
|
| 458 |
+
if ( isset( $_POST[ $nonce ] ) && wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST[ $nonce ] ) ), $action ) ) {
|
| 459 |
return true;
|
| 460 |
}
|
| 461 |
return false;
|
| 466 |
*
|
| 467 |
* @since 2.2
|
| 468 |
*
|
| 469 |
+
* @param string $post_type Post type.
|
| 470 |
* @return bool
|
| 471 |
*/
|
| 472 |
private static function edit_form_after_title_supported( $post_type = '' ) {
|
| 483 |
*
|
| 484 |
* @since 3.1
|
| 485 |
*
|
| 486 |
+
* @param string $post_type Post type.
|
| 487 |
* @return bool
|
| 488 |
*/
|
| 489 |
private static function gutenberg_supported( $post_type = '' ) {
|
| 501 |
*
|
| 502 |
* @since 3.1
|
| 503 |
*
|
| 504 |
+
* @param string $post_type Post type.
|
| 505 |
+
* @return string Position.
|
| 506 |
*/
|
| 507 |
private static function subtitle_field_position( $post_type = '' ) {
|
| 508 |
|
| 520 |
|
| 521 |
}
|
| 522 |
|
| 523 |
+
public static function sanitize_subtitle_value( $value ) {
|
| 524 |
+
|
| 525 |
+
return wp_kses( $value, wp_kses_allowed_html( 'data' ) );
|
| 526 |
+
|
| 527 |
+
}
|
| 528 |
+
|
| 529 |
}
|
plugin/admin/js/admin-edit.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
| 8 |
// inlineEditPost does not invoke any events, but does ensure to stop
|
| 9 |
// propagation to all other event handlers; swap it out.
|
| 10 |
inlineEditPost.editPreWpSubtitle = inlineEditPost.edit;
|
| 11 |
-
inlineEditPost.edit
|
| 12 |
|
| 13 |
// Invoke original edit event handler.
|
| 14 |
this.editPreWpSubtitle.apply( this, arguments );
|
|
@@ -35,4 +35,4 @@
|
|
| 35 |
|
| 36 |
}
|
| 37 |
|
| 38 |
-
} )
|
| 8 |
// inlineEditPost does not invoke any events, but does ensure to stop
|
| 9 |
// propagation to all other event handlers; swap it out.
|
| 10 |
inlineEditPost.editPreWpSubtitle = inlineEditPost.edit;
|
| 11 |
+
inlineEditPost.edit = function ( id ) {
|
| 12 |
|
| 13 |
// Invoke original edit event handler.
|
| 14 |
this.editPreWpSubtitle.apply( this, arguments );
|
| 35 |
|
| 36 |
}
|
| 37 |
|
| 38 |
+
} )( jQuery, inlineEditPost );
|
plugin/admin/js/pointers.js
CHANGED
|
@@ -1,25 +1,32 @@
|
|
| 1 |
-
|
| 2 |
/**
|
| 3 |
* @package WP Subtitle
|
| 4 |
* @subpackage JavaScript > Pointers
|
| 5 |
*/
|
| 6 |
|
| 7 |
-
jQuery( document ).ready(
|
|
|
|
| 8 |
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
|
| 20 |
-
|
| 21 |
-
|
| 22 |
|
| 23 |
-
|
| 24 |
|
| 25 |
-
}
|
|
|
|
|
|
| 1 |
/**
|
| 2 |
* @package WP Subtitle
|
| 3 |
* @subpackage JavaScript > Pointers
|
| 4 |
*/
|
| 5 |
|
| 6 |
+
jQuery( document ).ready(
|
| 7 |
+
function( $ ) {
|
| 8 |
|
| 9 |
+
function wps_subtitle_open_pointer( i ) {
|
| 10 |
+
pointer = wpsSubtitlePointer.pointers[ i ];
|
| 11 |
+
options = $.extend(
|
| 12 |
+
pointer.options,
|
| 13 |
+
{
|
| 14 |
+
close : function() {
|
| 15 |
+
$.post(
|
| 16 |
+
ajaxurl,
|
| 17 |
+
{
|
| 18 |
+
pointer : pointer.pointer_id,
|
| 19 |
+
action : 'dismiss-wp-pointer'
|
| 20 |
+
}
|
| 21 |
+
);
|
| 22 |
+
}
|
| 23 |
+
}
|
| 24 |
+
);
|
| 25 |
|
| 26 |
+
$( pointer.target ).pointer( options ).pointer( 'open' );
|
| 27 |
+
}
|
| 28 |
|
| 29 |
+
wps_subtitle_open_pointer( 0 );
|
| 30 |
|
| 31 |
+
}
|
| 32 |
+
);
|
plugin/admin/pointers.php
CHANGED
|
@@ -31,7 +31,7 @@ class WPSubtitle_Pointers {
|
|
| 31 |
* @since 2.2
|
| 32 |
* @internal
|
| 33 |
*
|
| 34 |
-
* @param string
|
| 35 |
*/
|
| 36 |
public static function _pointer_load( $hook_suffix ) {
|
| 37 |
|
|
@@ -54,7 +54,7 @@ class WPSubtitle_Pointers {
|
|
| 54 |
|
| 55 |
// Enqueue pointer scripts and styles.
|
| 56 |
wp_enqueue_style( 'wp-pointer' );
|
| 57 |
-
wp_enqueue_script( 'wps-subtitle-pointer', plugins_url( 'js/pointers.js', __FILE__ ), array( 'wp-pointer' ) );
|
| 58 |
wp_localize_script( 'wps-subtitle-pointer', 'wpsSubtitlePointer', $valid_pointers );
|
| 59 |
|
| 60 |
}
|
|
@@ -71,7 +71,7 @@ class WPSubtitle_Pointers {
|
|
| 71 |
*/
|
| 72 |
private static function get_current_pointers() {
|
| 73 |
|
| 74 |
-
$screen
|
| 75 |
$pointers = apply_filters( 'wps_subtitle_admin_pointers-' . $screen->id, array() );
|
| 76 |
|
| 77 |
// Only return valid array of pointers.
|
|
@@ -89,19 +89,19 @@ class WPSubtitle_Pointers {
|
|
| 89 |
* @since 2.4
|
| 90 |
* @internal
|
| 91 |
*
|
| 92 |
-
* @param array
|
| 93 |
* @return array Active pointers.
|
| 94 |
*/
|
| 95 |
private static function remove_dismissed_pointers( $pointers ) {
|
| 96 |
|
| 97 |
-
$dismissed
|
| 98 |
$valid_pointers = array();
|
| 99 |
|
| 100 |
// Check pointers and remove dismissed ones.
|
| 101 |
foreach ( $pointers as $pointer_id => $pointer ) {
|
| 102 |
|
| 103 |
// Sanity check
|
| 104 |
-
if ( in_array( $pointer_id, $dismissed ) || empty( $pointer )
|
| 105 |
continue;
|
| 106 |
}
|
| 107 |
|
|
@@ -136,7 +136,7 @@ class WPSubtitle_Pointers {
|
|
| 136 |
* @since 2.2
|
| 137 |
* @internal
|
| 138 |
*
|
| 139 |
-
* @param array
|
| 140 |
* @return array Pointers.
|
| 141 |
*/
|
| 142 |
public static function _post_type_pointers( $pointers ) {
|
|
@@ -145,15 +145,16 @@ class WPSubtitle_Pointers {
|
|
| 145 |
$pointers['wps_subtitle_field_to_top'] = array(
|
| 146 |
'target' => '#subtitlewrap',
|
| 147 |
'options' => array(
|
| 148 |
-
'content'
|
|
|
|
| 149 |
sprintf( __( '%s Field', 'wp-subtitle' ), WPSubtitle_Admin::get_meta_box_title( get_post_type( get_queried_object_id() ) ) ),
|
| 150 |
__( 'This field has moved from a meta box to below the post title.', 'wp-subtitle' )
|
| 151 |
),
|
| 152 |
'position' => array(
|
| 153 |
'edge' => 'top',
|
| 154 |
-
'align' => 'middle'
|
| 155 |
-
)
|
| 156 |
-
)
|
| 157 |
);
|
| 158 |
|
| 159 |
return $pointers;
|
| 31 |
* @since 2.2
|
| 32 |
* @internal
|
| 33 |
*
|
| 34 |
+
* @param string $hook_suffix Page hook.
|
| 35 |
*/
|
| 36 |
public static function _pointer_load( $hook_suffix ) {
|
| 37 |
|
| 54 |
|
| 55 |
// Enqueue pointer scripts and styles.
|
| 56 |
wp_enqueue_style( 'wp-pointer' );
|
| 57 |
+
wp_enqueue_script( 'wps-subtitle-pointer', plugins_url( 'js/pointers.js', __FILE__ ), array( 'wp-pointer' ), '3.4.1', true );
|
| 58 |
wp_localize_script( 'wps-subtitle-pointer', 'wpsSubtitlePointer', $valid_pointers );
|
| 59 |
|
| 60 |
}
|
| 71 |
*/
|
| 72 |
private static function get_current_pointers() {
|
| 73 |
|
| 74 |
+
$screen = get_current_screen();
|
| 75 |
$pointers = apply_filters( 'wps_subtitle_admin_pointers-' . $screen->id, array() );
|
| 76 |
|
| 77 |
// Only return valid array of pointers.
|
| 89 |
* @since 2.4
|
| 90 |
* @internal
|
| 91 |
*
|
| 92 |
+
* @param array $pointers Pointers.
|
| 93 |
* @return array Active pointers.
|
| 94 |
*/
|
| 95 |
private static function remove_dismissed_pointers( $pointers ) {
|
| 96 |
|
| 97 |
+
$dismissed = self::get_dismissed_pointers();
|
| 98 |
$valid_pointers = array();
|
| 99 |
|
| 100 |
// Check pointers and remove dismissed ones.
|
| 101 |
foreach ( $pointers as $pointer_id => $pointer ) {
|
| 102 |
|
| 103 |
// Sanity check
|
| 104 |
+
if ( in_array( $pointer_id, $dismissed ) || empty( $pointer ) || empty( $pointer_id ) || empty( $pointer['target'] ) || empty( $pointer['options'] ) ) {
|
| 105 |
continue;
|
| 106 |
}
|
| 107 |
|
| 136 |
* @since 2.2
|
| 137 |
* @internal
|
| 138 |
*
|
| 139 |
+
* @param array $pointers Pointers.
|
| 140 |
* @return array Pointers.
|
| 141 |
*/
|
| 142 |
public static function _post_type_pointers( $pointers ) {
|
| 145 |
$pointers['wps_subtitle_field_to_top'] = array(
|
| 146 |
'target' => '#subtitlewrap',
|
| 147 |
'options' => array(
|
| 148 |
+
'content' => sprintf(
|
| 149 |
+
'<h3>%s</h3><p>%s</p>',
|
| 150 |
sprintf( __( '%s Field', 'wp-subtitle' ), WPSubtitle_Admin::get_meta_box_title( get_post_type( get_queried_object_id() ) ) ),
|
| 151 |
__( 'This field has moved from a meta box to below the post title.', 'wp-subtitle' )
|
| 152 |
),
|
| 153 |
'position' => array(
|
| 154 |
'edge' => 'top',
|
| 155 |
+
'align' => 'middle',
|
| 156 |
+
),
|
| 157 |
+
),
|
| 158 |
);
|
| 159 |
|
| 160 |
return $pointers;
|
plugin/includes/class-api.php
CHANGED
|
@@ -22,7 +22,9 @@
|
|
| 22 |
* ) );
|
| 23 |
*/
|
| 24 |
|
| 25 |
-
if ( ! defined( 'ABSPATH' ) )
|
|
|
|
|
|
|
| 26 |
|
| 27 |
class WP_Subtitle_API {
|
| 28 |
|
|
@@ -39,7 +41,7 @@ class WP_Subtitle_API {
|
|
| 39 |
/**
|
| 40 |
* The Subtitle
|
| 41 |
*
|
| 42 |
-
* @param array
|
| 43 |
*
|
| 44 |
* @internal Private. Called via the `the_subtitle` action.
|
| 45 |
*/
|
|
@@ -47,29 +49,32 @@ class WP_Subtitle_API {
|
|
| 47 |
|
| 48 |
$default_value = isset( $args['default_value'] ) ? $args['default_value'] : '';
|
| 49 |
|
| 50 |
-
echo $this->get_subtitle( $default_value, $args );
|
| 51 |
|
| 52 |
}
|
| 53 |
|
| 54 |
/**
|
| 55 |
* Get Subtitle
|
| 56 |
*
|
| 57 |
-
* @param string
|
| 58 |
-
* @param array
|
| 59 |
* @return string The subtitle.
|
| 60 |
*
|
| 61 |
* @internal Private. Called via the `get_subtitle` action.
|
| 62 |
*/
|
| 63 |
public function get_subtitle( $default_subtitle, $args = '' ) {
|
| 64 |
|
| 65 |
-
$args = wp_parse_args(
|
| 66 |
-
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
|
|
|
|
|
|
|
|
|
| 70 |
|
| 71 |
$subtitle_obj = new WP_Subtitle( $args['post_id'] );
|
| 72 |
-
$subtitle
|
| 73 |
|
| 74 |
if ( ! empty( $subtitle ) ) {
|
| 75 |
return $subtitle;
|
| 22 |
* ) );
|
| 23 |
*/
|
| 24 |
|
| 25 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 26 |
+
exit; // Exit if accessed directly
|
| 27 |
+
}
|
| 28 |
|
| 29 |
class WP_Subtitle_API {
|
| 30 |
|
| 41 |
/**
|
| 42 |
* The Subtitle
|
| 43 |
*
|
| 44 |
+
* @param array $args Display args.
|
| 45 |
*
|
| 46 |
* @internal Private. Called via the `the_subtitle` action.
|
| 47 |
*/
|
| 49 |
|
| 50 |
$default_value = isset( $args['default_value'] ) ? $args['default_value'] : '';
|
| 51 |
|
| 52 |
+
echo wp_kses_post( $this->get_subtitle( $default_value, $args ) );
|
| 53 |
|
| 54 |
}
|
| 55 |
|
| 56 |
/**
|
| 57 |
* Get Subtitle
|
| 58 |
*
|
| 59 |
+
* @param string $default_subtitle Default/fallback subtitle.
|
| 60 |
+
* @param array $args Display args.
|
| 61 |
* @return string The subtitle.
|
| 62 |
*
|
| 63 |
* @internal Private. Called via the `get_subtitle` action.
|
| 64 |
*/
|
| 65 |
public function get_subtitle( $default_subtitle, $args = '' ) {
|
| 66 |
|
| 67 |
+
$args = wp_parse_args(
|
| 68 |
+
$args,
|
| 69 |
+
array(
|
| 70 |
+
'post_id' => get_the_ID(), // Post ID
|
| 71 |
+
'before' => '', // Before subtitle HTML output
|
| 72 |
+
'after' => '', // After subtitle HTML output
|
| 73 |
+
)
|
| 74 |
+
);
|
| 75 |
|
| 76 |
$subtitle_obj = new WP_Subtitle( $args['post_id'] );
|
| 77 |
+
$subtitle = $subtitle_obj->get_subtitle( $args );
|
| 78 |
|
| 79 |
if ( ! empty( $subtitle ) ) {
|
| 80 |
return $subtitle;
|
plugin/includes/compat/seopress.php
CHANGED
|
@@ -50,7 +50,7 @@ class WPSubtitle_SEOPress {
|
|
| 50 |
*
|
| 51 |
* @since 3.4
|
| 52 |
*
|
| 53 |
-
* @param array
|
| 54 |
* @return array Filtered replacements variables.
|
| 55 |
*
|
| 56 |
* @internal Called via the `seopress_titles_template_variables_array` filter.
|
|
@@ -70,7 +70,7 @@ class WPSubtitle_SEOPress {
|
|
| 70 |
*
|
| 71 |
* @since 3.4
|
| 72 |
*
|
| 73 |
-
* @param array
|
| 74 |
* @return array Filtered replacements values.
|
| 75 |
*
|
| 76 |
* @internal Called via the `seopress_titles_template_replace_array` filter.
|
|
@@ -80,19 +80,19 @@ class WPSubtitle_SEOPress {
|
|
| 80 |
global $post;
|
| 81 |
|
| 82 |
$wp_subtitle = new WP_Subtitle( $post );
|
| 83 |
-
$subtitle
|
| 84 |
|
| 85 |
$replacements[] = $subtitle;
|
| 86 |
|
| 87 |
$sep = ' ' . $replacements[0] . ' ';
|
| 88 |
|
| 89 |
$before_sep = '';
|
| 90 |
-
$after_sep
|
| 91 |
|
| 92 |
if ( ! empty( $subtitle ) ) {
|
| 93 |
|
| 94 |
$before_sep = apply_filters( 'wps_subtitle_seo_before_sep', $sep );
|
| 95 |
-
$after_sep
|
| 96 |
|
| 97 |
}
|
| 98 |
|
| 50 |
*
|
| 51 |
* @since 3.4
|
| 52 |
*
|
| 53 |
+
* @param array $replacements SEO replacements variables.
|
| 54 |
* @return array Filtered replacements variables.
|
| 55 |
*
|
| 56 |
* @internal Called via the `seopress_titles_template_variables_array` filter.
|
| 70 |
*
|
| 71 |
* @since 3.4
|
| 72 |
*
|
| 73 |
+
* @param array $replacements SEO replacements values.
|
| 74 |
* @return array Filtered replacements values.
|
| 75 |
*
|
| 76 |
* @internal Called via the `seopress_titles_template_replace_array` filter.
|
| 80 |
global $post;
|
| 81 |
|
| 82 |
$wp_subtitle = new WP_Subtitle( $post );
|
| 83 |
+
$subtitle = $wp_subtitle->get_subtitle();
|
| 84 |
|
| 85 |
$replacements[] = $subtitle;
|
| 86 |
|
| 87 |
$sep = ' ' . $replacements[0] . ' ';
|
| 88 |
|
| 89 |
$before_sep = '';
|
| 90 |
+
$after_sep = '';
|
| 91 |
|
| 92 |
if ( ! empty( $subtitle ) ) {
|
| 93 |
|
| 94 |
$before_sep = apply_filters( 'wps_subtitle_seo_before_sep', $sep );
|
| 95 |
+
$after_sep = apply_filters( 'wps_subtitle_seo_after_sep', $sep );
|
| 96 |
|
| 97 |
}
|
| 98 |
|
plugin/includes/compat/woocommerce.php
CHANGED
|
@@ -21,21 +21,20 @@ class WPSubtitle_WooCommerce {
|
|
| 21 |
*/
|
| 22 |
public function __construct() {
|
| 23 |
|
| 24 |
-
if ( 'yes'
|
| 25 |
|
| 26 |
add_action( 'init', array( $this, 'add_product_post_type_support' ) );
|
| 27 |
|
| 28 |
-
if ( 'yes'
|
| 29 |
-
add_action( 'woocommerce_single_product_summary'
|
| 30 |
}
|
| 31 |
|
| 32 |
-
if ( 'yes'
|
| 33 |
-
add_action( 'woocommerce_shop_loop_item_title'
|
| 34 |
}
|
| 35 |
-
|
| 36 |
}
|
| 37 |
|
| 38 |
-
add_filter( 'woocommerce_product_settings'
|
| 39 |
|
| 40 |
}
|
| 41 |
|
|
@@ -61,10 +60,13 @@ class WPSubtitle_WooCommerce {
|
|
| 61 |
*/
|
| 62 |
public function single_product_summary() {
|
| 63 |
|
| 64 |
-
do_action(
|
| 65 |
-
'
|
| 66 |
-
|
| 67 |
-
|
|
|
|
|
|
|
|
|
|
| 68 |
|
| 69 |
}
|
| 70 |
|
|
@@ -77,10 +79,13 @@ class WPSubtitle_WooCommerce {
|
|
| 77 |
*/
|
| 78 |
public function shop_loop_item_title() {
|
| 79 |
|
| 80 |
-
do_action(
|
| 81 |
-
'
|
| 82 |
-
|
| 83 |
-
|
|
|
|
|
|
|
|
|
|
| 84 |
|
| 85 |
}
|
| 86 |
|
|
@@ -89,7 +94,7 @@ class WPSubtitle_WooCommerce {
|
|
| 89 |
*
|
| 90 |
* @since 3.1
|
| 91 |
*
|
| 92 |
-
* @param array
|
| 93 |
* @return array Settings.
|
| 94 |
*
|
| 95 |
* @internal Private. Called via the `woocommerce_product_settings` filter.
|
|
@@ -102,7 +107,7 @@ class WPSubtitle_WooCommerce {
|
|
| 102 |
'title' => __( 'WP Subtitle', 'wp-subtitle' ),
|
| 103 |
'type' => 'title',
|
| 104 |
'desc' => '',
|
| 105 |
-
'id' => 'wp_subtitle_options'
|
| 106 |
),
|
| 107 |
|
| 108 |
array(
|
|
@@ -119,7 +124,7 @@ class WPSubtitle_WooCommerce {
|
|
| 119 |
'id' => 'wp_subtitle_woocommerce_show_on_single',
|
| 120 |
'default' => 'yes',
|
| 121 |
'type' => 'checkbox',
|
| 122 |
-
'checkboxgroup' => 'start'
|
| 123 |
),
|
| 124 |
|
| 125 |
array(
|
|
@@ -127,13 +132,13 @@ class WPSubtitle_WooCommerce {
|
|
| 127 |
'id' => 'wp_subtitle_woocommerce_show_in_loop',
|
| 128 |
'default' => 'yes',
|
| 129 |
'type' => 'checkbox',
|
| 130 |
-
'checkboxgroup' => 'end'
|
| 131 |
),
|
| 132 |
|
| 133 |
array(
|
| 134 |
'type' => 'sectionend',
|
| 135 |
-
'id' => 'wp_subtitle_options'
|
| 136 |
-
)
|
| 137 |
|
| 138 |
);
|
| 139 |
|
| 21 |
*/
|
| 22 |
public function __construct() {
|
| 23 |
|
| 24 |
+
if ( 'yes' === get_option( 'wp_subtitle_woocommerce_enabled' ) ) {
|
| 25 |
|
| 26 |
add_action( 'init', array( $this, 'add_product_post_type_support' ) );
|
| 27 |
|
| 28 |
+
if ( 'yes' === get_option( 'wp_subtitle_woocommerce_show_on_single' ) ) {
|
| 29 |
+
add_action( 'woocommerce_single_product_summary', array( $this, 'single_product_summary' ), 6 );
|
| 30 |
}
|
| 31 |
|
| 32 |
+
if ( 'yes' === get_option( 'wp_subtitle_woocommerce_show_in_loop' ) ) {
|
| 33 |
+
add_action( 'woocommerce_shop_loop_item_title', array( $this, 'shop_loop_item_title' ) );
|
| 34 |
}
|
|
|
|
| 35 |
}
|
| 36 |
|
| 37 |
+
add_filter( 'woocommerce_product_settings', array( $this, 'product_settings' ) );
|
| 38 |
|
| 39 |
}
|
| 40 |
|
| 60 |
*/
|
| 61 |
public function single_product_summary() {
|
| 62 |
|
| 63 |
+
do_action(
|
| 64 |
+
'plugins/wp_subtitle/the_subtitle',
|
| 65 |
+
array(
|
| 66 |
+
'before' => '<h2 class="product_subtitle entry-subtitle wp-subtitle">',
|
| 67 |
+
'after' => '</h2>',
|
| 68 |
+
)
|
| 69 |
+
);
|
| 70 |
|
| 71 |
}
|
| 72 |
|
| 79 |
*/
|
| 80 |
public function shop_loop_item_title() {
|
| 81 |
|
| 82 |
+
do_action(
|
| 83 |
+
'plugins/wp_subtitle/the_subtitle',
|
| 84 |
+
array(
|
| 85 |
+
'before' => '<p class="woocommerce-loop-product__subtitle wp-subtitle">',
|
| 86 |
+
'after' => '</p>',
|
| 87 |
+
)
|
| 88 |
+
);
|
| 89 |
|
| 90 |
}
|
| 91 |
|
| 94 |
*
|
| 95 |
* @since 3.1
|
| 96 |
*
|
| 97 |
+
* @param array $settings Settings.
|
| 98 |
* @return array Settings.
|
| 99 |
*
|
| 100 |
* @internal Private. Called via the `woocommerce_product_settings` filter.
|
| 107 |
'title' => __( 'WP Subtitle', 'wp-subtitle' ),
|
| 108 |
'type' => 'title',
|
| 109 |
'desc' => '',
|
| 110 |
+
'id' => 'wp_subtitle_options',
|
| 111 |
),
|
| 112 |
|
| 113 |
array(
|
| 124 |
'id' => 'wp_subtitle_woocommerce_show_on_single',
|
| 125 |
'default' => 'yes',
|
| 126 |
'type' => 'checkbox',
|
| 127 |
+
'checkboxgroup' => 'start',
|
| 128 |
),
|
| 129 |
|
| 130 |
array(
|
| 132 |
'id' => 'wp_subtitle_woocommerce_show_in_loop',
|
| 133 |
'default' => 'yes',
|
| 134 |
'type' => 'checkbox',
|
| 135 |
+
'checkboxgroup' => 'end',
|
| 136 |
),
|
| 137 |
|
| 138 |
array(
|
| 139 |
'type' => 'sectionend',
|
| 140 |
+
'id' => 'wp_subtitle_options',
|
| 141 |
+
),
|
| 142 |
|
| 143 |
);
|
| 144 |
|
plugin/includes/compat/wordpress-seo.php
CHANGED
|
@@ -49,7 +49,7 @@ class WPSubtitle_WPSEO {
|
|
| 49 |
*
|
| 50 |
* @since 3.1
|
| 51 |
*
|
| 52 |
-
* @param array
|
| 53 |
* @return array Filtered replacements.
|
| 54 |
*
|
| 55 |
* @internal Called via the `wpseo_replacements` filter.
|
|
@@ -59,18 +59,18 @@ class WPSubtitle_WPSEO {
|
|
| 59 |
global $post;
|
| 60 |
|
| 61 |
$wp_subtitle = new WP_Subtitle( $post );
|
| 62 |
-
$subtitle
|
| 63 |
|
| 64 |
-
$replacements['%%wps_subtitle%%']
|
| 65 |
$replacements['%%wps_subtitle_before_sep%%'] = '';
|
| 66 |
-
$replacements['%%wps_subtitle_after_sep%%']
|
| 67 |
|
| 68 |
if ( ! empty( $subtitle ) ) {
|
| 69 |
|
| 70 |
$sep = isset( $replacements['%%sep%%'] ) ? ' ' . $replacements['%%sep%%'] . ' ' : ' - ';
|
| 71 |
|
| 72 |
$replacements['%%wps_subtitle_before_sep%%'] = apply_filters( 'wps_subtitle_seo_before_sep', $sep );
|
| 73 |
-
$replacements['%%wps_subtitle_after_sep%%']
|
| 74 |
|
| 75 |
}
|
| 76 |
|
| 49 |
*
|
| 50 |
* @since 3.1
|
| 51 |
*
|
| 52 |
+
* @param array $replacements SEO replacements.
|
| 53 |
* @return array Filtered replacements.
|
| 54 |
*
|
| 55 |
* @internal Called via the `wpseo_replacements` filter.
|
| 59 |
global $post;
|
| 60 |
|
| 61 |
$wp_subtitle = new WP_Subtitle( $post );
|
| 62 |
+
$subtitle = $wp_subtitle->get_subtitle();
|
| 63 |
|
| 64 |
+
$replacements['%%wps_subtitle%%'] = $subtitle;
|
| 65 |
$replacements['%%wps_subtitle_before_sep%%'] = '';
|
| 66 |
+
$replacements['%%wps_subtitle_after_sep%%'] = '';
|
| 67 |
|
| 68 |
if ( ! empty( $subtitle ) ) {
|
| 69 |
|
| 70 |
$sep = isset( $replacements['%%sep%%'] ) ? ' ' . $replacements['%%sep%%'] . ' ' : ' - ';
|
| 71 |
|
| 72 |
$replacements['%%wps_subtitle_before_sep%%'] = apply_filters( 'wps_subtitle_seo_before_sep', $sep );
|
| 73 |
+
$replacements['%%wps_subtitle_after_sep%%'] = apply_filters( 'wps_subtitle_seo_after_sep', $sep );
|
| 74 |
|
| 75 |
}
|
| 76 |
|
plugin/includes/deprecated.php
CHANGED
|
@@ -13,26 +13,33 @@
|
|
| 13 |
*
|
| 14 |
* @uses WP_Subtitle::get_subtitle()
|
| 15 |
*
|
| 16 |
-
* @param string
|
| 17 |
-
* @param string
|
| 18 |
-
* @param bool
|
| 19 |
* @return string The subtitle string.
|
| 20 |
*/
|
| 21 |
function the_subtitle( $before = '', $after = '', $echo = true ) {
|
| 22 |
|
| 23 |
if ( ! $echo ) {
|
| 24 |
|
| 25 |
-
return apply_filters(
|
| 26 |
-
'
|
| 27 |
-
'
|
| 28 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
|
| 30 |
}
|
| 31 |
|
| 32 |
-
do_action(
|
| 33 |
-
'
|
| 34 |
-
|
| 35 |
-
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
}
|
| 38 |
|
|
@@ -44,25 +51,29 @@ function the_subtitle( $before = '', $after = '', $echo = true ) {
|
|
| 44 |
*
|
| 45 |
* @uses WP_Subtitle::get_subtitle()
|
| 46 |
*
|
| 47 |
-
* @param int|object
|
| 48 |
-
* @param string
|
| 49 |
-
* @param string
|
| 50 |
-
* @param bool
|
| 51 |
* @return string The subtitle string.
|
| 52 |
*/
|
| 53 |
function get_the_subtitle( $post = 0, $before = '', $after = '', $echo = true ) {
|
| 54 |
|
| 55 |
-
$output = apply_filters(
|
| 56 |
-
'
|
| 57 |
-
'
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
if ( ! $echo ) {
|
| 62 |
return $output;
|
| 63 |
}
|
| 64 |
|
| 65 |
-
echo $output;
|
| 66 |
|
| 67 |
}
|
| 68 |
|
|
@@ -127,6 +138,8 @@ function wps_showSubtitlePanelOld() {
|
|
| 127 |
*
|
| 128 |
* @since 1.0
|
| 129 |
* @deprecated 2.0 Legacy function.
|
|
|
|
|
|
|
| 130 |
*/
|
| 131 |
function wps_saveSubtitle( $post_id ) {
|
| 132 |
_deprecated_function( 'wps_saveSubtitle()', '2.0' );
|
| 13 |
*
|
| 14 |
* @uses WP_Subtitle::get_subtitle()
|
| 15 |
*
|
| 16 |
+
* @param string $before Before the subtitle.
|
| 17 |
+
* @param string $after After the subtitle.
|
| 18 |
+
* @param bool $echo Output if true, return if false.
|
| 19 |
* @return string The subtitle string.
|
| 20 |
*/
|
| 21 |
function the_subtitle( $before = '', $after = '', $echo = true ) {
|
| 22 |
|
| 23 |
if ( ! $echo ) {
|
| 24 |
|
| 25 |
+
return apply_filters(
|
| 26 |
+
'plugins/wp_subtitle/get_subtitle',
|
| 27 |
+
'',
|
| 28 |
+
array(
|
| 29 |
+
'before' => $before,
|
| 30 |
+
'after' => $after,
|
| 31 |
+
)
|
| 32 |
+
);
|
| 33 |
|
| 34 |
}
|
| 35 |
|
| 36 |
+
do_action(
|
| 37 |
+
'plugins/wp_subtitle/the_subtitle',
|
| 38 |
+
array(
|
| 39 |
+
'before' => $before,
|
| 40 |
+
'after' => $after,
|
| 41 |
+
)
|
| 42 |
+
);
|
| 43 |
|
| 44 |
}
|
| 45 |
|
| 51 |
*
|
| 52 |
* @uses WP_Subtitle::get_subtitle()
|
| 53 |
*
|
| 54 |
+
* @param int|object $post Post ID or object.
|
| 55 |
+
* @param string $before Before the subtitle.
|
| 56 |
+
* @param string $after After the subtitle.
|
| 57 |
+
* @param bool $echo Output if true, return if false.
|
| 58 |
* @return string The subtitle string.
|
| 59 |
*/
|
| 60 |
function get_the_subtitle( $post = 0, $before = '', $after = '', $echo = true ) {
|
| 61 |
|
| 62 |
+
$output = apply_filters(
|
| 63 |
+
'plugins/wp_subtitle/get_subtitle',
|
| 64 |
+
'',
|
| 65 |
+
array(
|
| 66 |
+
'post_id' => is_a( $post, 'WP_Post' ) ? $post->ID : $post,
|
| 67 |
+
'before' => $before,
|
| 68 |
+
'after' => $after,
|
| 69 |
+
)
|
| 70 |
+
);
|
| 71 |
|
| 72 |
if ( ! $echo ) {
|
| 73 |
return $output;
|
| 74 |
}
|
| 75 |
|
| 76 |
+
echo wp_kses_post( $output );
|
| 77 |
|
| 78 |
}
|
| 79 |
|
| 138 |
*
|
| 139 |
* @since 1.0
|
| 140 |
* @deprecated 2.0 Legacy function.
|
| 141 |
+
*
|
| 142 |
+
* @param int $post_id Post ID.
|
| 143 |
*/
|
| 144 |
function wps_saveSubtitle( $post_id ) {
|
| 145 |
_deprecated_function( 'wps_saveSubtitle()', '2.0' );
|
plugin/includes/rest.php
CHANGED
|
@@ -35,11 +35,15 @@ class WPSubtitle_REST {
|
|
| 35 |
|
| 36 |
foreach ( $post_types as $post_type ) {
|
| 37 |
|
| 38 |
-
register_rest_field(
|
| 39 |
-
|
| 40 |
-
'
|
| 41 |
-
|
| 42 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
|
| 44 |
}
|
| 45 |
|
|
@@ -52,9 +56,9 @@ class WPSubtitle_REST {
|
|
| 52 |
*
|
| 53 |
* @internal Called via register_rest_field() callback.
|
| 54 |
*
|
| 55 |
-
* @param array
|
| 56 |
-
* @param string
|
| 57 |
-
* @param WP_REST_Request
|
| 58 |
* @return string Subtitle
|
| 59 |
*/
|
| 60 |
public function get_rest_field( $object, $field_name, $request ) {
|
|
@@ -72,8 +76,8 @@ class WPSubtitle_REST {
|
|
| 72 |
*
|
| 73 |
* @internal Called via register_rest_field() callback.
|
| 74 |
*
|
| 75 |
-
* @param string
|
| 76 |
-
* @param array
|
| 77 |
*/
|
| 78 |
public function update_rest_field( $value, $object ) {
|
| 79 |
|
| 35 |
|
| 36 |
foreach ( $post_types as $post_type ) {
|
| 37 |
|
| 38 |
+
register_rest_field(
|
| 39 |
+
$post_types,
|
| 40 |
+
'wps_subtitle',
|
| 41 |
+
array(
|
| 42 |
+
'get_callback' => array( $this, 'get_rest_field' ),
|
| 43 |
+
'update_callback' => array( $this, 'update_rest_field' ),
|
| 44 |
+
'schema' => null,
|
| 45 |
+
)
|
| 46 |
+
);
|
| 47 |
|
| 48 |
}
|
| 49 |
|
| 56 |
*
|
| 57 |
* @internal Called via register_rest_field() callback.
|
| 58 |
*
|
| 59 |
+
* @param array $object Current post details.
|
| 60 |
+
* @param string $field_name Name of field.
|
| 61 |
+
* @param WP_REST_Request $request Current request.
|
| 62 |
* @return string Subtitle
|
| 63 |
*/
|
| 64 |
public function get_rest_field( $object, $field_name, $request ) {
|
| 76 |
*
|
| 77 |
* @internal Called via register_rest_field() callback.
|
| 78 |
*
|
| 79 |
+
* @param string $value New value for the field.
|
| 80 |
+
* @param array $object Current post details.
|
| 81 |
*/
|
| 82 |
public function update_rest_field( $value, $object ) {
|
| 83 |
|
plugin/includes/shortcode.php
CHANGED
|
@@ -15,40 +15,46 @@ class WPSubtitle_Shortcode {
|
|
| 15 |
* content will be used as a fallback if no subtitle is specified.
|
| 16 |
* e.g. [wp_subtitle]Fallback Subtitle[/wp_subtitle]
|
| 17 |
*
|
| 18 |
-
* @param array
|
| 19 |
-
* @param string
|
| 20 |
* @return string Subtitle HTML.
|
| 21 |
*/
|
| 22 |
public static function shortcode( $atts, $content = null ) {
|
| 23 |
|
| 24 |
global $post;
|
| 25 |
|
| 26 |
-
$atts = shortcode_atts(
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
// Get HTML tag
|
| 33 |
if ( ! empty( $atts['tag'] ) ) {
|
| 34 |
-
$tag
|
| 35 |
$before = sprintf( '<%s class="wp-subtitle">', $tag );
|
| 36 |
-
$after
|
| 37 |
} else {
|
| 38 |
$before = '';
|
| 39 |
-
$after
|
| 40 |
}
|
| 41 |
|
| 42 |
// Add before/after content
|
| 43 |
$before .= self::format_subtitle_content( $atts['before'], 'before' );
|
| 44 |
-
$after
|
| 45 |
|
| 46 |
$subtitle = new WP_Subtitle( $post );
|
| 47 |
|
| 48 |
-
return $subtitle->get_subtitle(
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
|
|
|
|
|
|
| 52 |
|
| 53 |
}
|
| 54 |
|
|
@@ -88,12 +94,12 @@ class WPSubtitle_Shortcode {
|
|
| 88 |
* @since 2.5
|
| 89 |
* @internal
|
| 90 |
*
|
| 91 |
-
* @param string
|
| 92 |
* @return string Validated tag.
|
| 93 |
*/
|
| 94 |
private static function validate_tag( $tag ) {
|
| 95 |
|
| 96 |
-
if ( ! in_array( $tag, self::get_allowed_tags() ) ) {
|
| 97 |
$tag = self::get_default_tag();
|
| 98 |
}
|
| 99 |
|
|
@@ -107,8 +113,8 @@ class WPSubtitle_Shortcode {
|
|
| 107 |
* @since 2.5
|
| 108 |
* @internal
|
| 109 |
*
|
| 110 |
-
* @param string
|
| 111 |
-
* @param string
|
| 112 |
* @return string HTML formatted content.
|
| 113 |
*/
|
| 114 |
private static function format_subtitle_content( $content, $type ) {
|
| 15 |
* content will be used as a fallback if no subtitle is specified.
|
| 16 |
* e.g. [wp_subtitle]Fallback Subtitle[/wp_subtitle]
|
| 17 |
*
|
| 18 |
+
* @param array $atts Shortcode attributes.
|
| 19 |
+
* @param string $content Fallback content (content between the shortcode tags).
|
| 20 |
* @return string Subtitle HTML.
|
| 21 |
*/
|
| 22 |
public static function shortcode( $atts, $content = null ) {
|
| 23 |
|
| 24 |
global $post;
|
| 25 |
|
| 26 |
+
$atts = shortcode_atts(
|
| 27 |
+
array(
|
| 28 |
+
'tag' => self::get_default_tag(),
|
| 29 |
+
'before' => '',
|
| 30 |
+
'after' => '',
|
| 31 |
+
),
|
| 32 |
+
$atts,
|
| 33 |
+
'wp_subtitle'
|
| 34 |
+
);
|
| 35 |
|
| 36 |
// Get HTML tag
|
| 37 |
if ( ! empty( $atts['tag'] ) ) {
|
| 38 |
+
$tag = self::validate_tag( $atts['tag'] );
|
| 39 |
$before = sprintf( '<%s class="wp-subtitle">', $tag );
|
| 40 |
+
$after = sprintf( '</%s>', $tag );
|
| 41 |
} else {
|
| 42 |
$before = '';
|
| 43 |
+
$after = '';
|
| 44 |
}
|
| 45 |
|
| 46 |
// Add before/after content
|
| 47 |
$before .= self::format_subtitle_content( $atts['before'], 'before' );
|
| 48 |
+
$after = self::format_subtitle_content( $atts['after'], 'after' ) . $after;
|
| 49 |
|
| 50 |
$subtitle = new WP_Subtitle( $post );
|
| 51 |
|
| 52 |
+
return $subtitle->get_subtitle(
|
| 53 |
+
array(
|
| 54 |
+
'before' => $before,
|
| 55 |
+
'after' => $after,
|
| 56 |
+
)
|
| 57 |
+
);
|
| 58 |
|
| 59 |
}
|
| 60 |
|
| 94 |
* @since 2.5
|
| 95 |
* @internal
|
| 96 |
*
|
| 97 |
+
* @param string $tag Tag to validate.
|
| 98 |
* @return string Validated tag.
|
| 99 |
*/
|
| 100 |
private static function validate_tag( $tag ) {
|
| 101 |
|
| 102 |
+
if ( ! in_array( $tag, self::get_allowed_tags(), true ) ) {
|
| 103 |
$tag = self::get_default_tag();
|
| 104 |
}
|
| 105 |
|
| 113 |
* @since 2.5
|
| 114 |
* @internal
|
| 115 |
*
|
| 116 |
+
* @param string $content Content.
|
| 117 |
+
* @param string $type Content type.
|
| 118 |
* @return string HTML formatted content.
|
| 119 |
*/
|
| 120 |
private static function format_subtitle_content( $content, $type ) {
|
plugin/includes/subtitle.php
CHANGED
|
@@ -17,7 +17,7 @@ class WP_Subtitle {
|
|
| 17 |
/**
|
| 18 |
* Constructor
|
| 19 |
*
|
| 20 |
-
* @param int|WP_Post
|
| 21 |
*/
|
| 22 |
public function __construct( $post ) {
|
| 23 |
|
|
@@ -33,11 +33,11 @@ class WP_Subtitle {
|
|
| 33 |
/**
|
| 34 |
* The Subtitle
|
| 35 |
*
|
| 36 |
-
* @param array
|
| 37 |
*/
|
| 38 |
public function the_subtitle( $args = '' ) {
|
| 39 |
|
| 40 |
-
echo $this->get_subtitle( $args );
|
| 41 |
|
| 42 |
}
|
| 43 |
|
|
@@ -46,17 +46,20 @@ class WP_Subtitle {
|
|
| 46 |
*
|
| 47 |
* @uses apply_filters( 'wps_subtitle' )
|
| 48 |
*
|
| 49 |
-
* @param array
|
| 50 |
* @return string The filtered subtitle meta value.
|
| 51 |
*/
|
| 52 |
public function get_subtitle( $args = '' ) {
|
| 53 |
|
| 54 |
if ( $this->post_id && $this->is_supported_post_type() ) {
|
| 55 |
|
| 56 |
-
$args = wp_parse_args(
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
|
|
|
|
|
|
|
|
|
| 60 |
|
| 61 |
$subtitle = apply_filters( 'wps_subtitle', $this->get_raw_subtitle(), get_post( $this->post_id ) );
|
| 62 |
|
|
@@ -82,15 +85,16 @@ class WP_Subtitle {
|
|
| 82 |
if ( is_preview() ) {
|
| 83 |
|
| 84 |
if ( isset( $_GET['preview_id'] ) ) {
|
| 85 |
-
$p =
|
| 86 |
return get_post_meta( $p->ID, $this->get_post_meta_key(), true );
|
| 87 |
}
|
| 88 |
|
| 89 |
-
|
|
|
|
|
|
|
| 90 |
$p = array_shift( $revisions );
|
| 91 |
return get_post_meta( $p->ID, $this->get_post_meta_key(), true );
|
| 92 |
}
|
| 93 |
-
|
| 94 |
}
|
| 95 |
|
| 96 |
return get_post_meta( $this->post_id, $this->get_post_meta_key(), true );
|
|
@@ -113,7 +117,7 @@ class WP_Subtitle {
|
|
| 113 |
/**
|
| 114 |
* Update Subtitle
|
| 115 |
*
|
| 116 |
-
* @param string
|
| 117 |
* @return int|bool Meta ID if new entry. True if updated, false if not updated or the same as current value.
|
| 118 |
*/
|
| 119 |
public function update_subtitle( $subtitle ) {
|
|
@@ -128,12 +132,12 @@ class WP_Subtitle {
|
|
| 128 |
*
|
| 129 |
* @since 2.9
|
| 130 |
*
|
| 131 |
-
* @param string
|
| 132 |
* @return boolean
|
| 133 |
*/
|
| 134 |
public function is_current_subtitle( $subtitle ) {
|
| 135 |
|
| 136 |
-
return
|
| 137 |
|
| 138 |
}
|
| 139 |
|
|
@@ -155,7 +159,7 @@ class WP_Subtitle {
|
|
| 155 |
*
|
| 156 |
* @since 2.9
|
| 157 |
*
|
| 158 |
-
* @param int
|
| 159 |
*/
|
| 160 |
public function restore_post_revision( $revision_id ) {
|
| 161 |
|
|
@@ -178,7 +182,7 @@ class WP_Subtitle {
|
|
| 178 |
|
| 179 |
$post_types = $this->get_supported_post_types();
|
| 180 |
|
| 181 |
-
return in_array( get_post_type( $this->post_id ), $post_types );
|
| 182 |
|
| 183 |
}
|
| 184 |
|
|
@@ -191,9 +195,11 @@ class WP_Subtitle {
|
|
| 191 |
*/
|
| 192 |
private function get_supported_post_types() {
|
| 193 |
|
| 194 |
-
$post_types = (array) get_post_types(
|
| 195 |
-
|
| 196 |
-
|
|
|
|
|
|
|
| 197 |
|
| 198 |
$post_types = array_merge( $post_types, array( 'post', 'page', 'revision' ) );
|
| 199 |
|
|
@@ -222,8 +228,9 @@ class WP_Subtitle {
|
|
| 222 |
if ( $this->is_supported_post_type() ) {
|
| 223 |
|
| 224 |
$post_type = get_post_type( $this->post_id );
|
|
|
|
| 225 |
|
| 226 |
-
if ( $revision
|
| 227 |
$post_type = get_post_type( $revision );
|
| 228 |
}
|
| 229 |
|
|
@@ -240,15 +247,16 @@ class WP_Subtitle {
|
|
| 240 |
|
| 241 |
// ... edit other post type
|
| 242 |
default:
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
|
| 246 |
-
|
|
|
|
|
|
|
| 247 |
|
| 248 |
return current_user_can( $post_types[ $post_type ]->cap->edit_post, $this->post_id );
|
| 249 |
|
| 250 |
}
|
| 251 |
-
|
| 252 |
}
|
| 253 |
|
| 254 |
return false;
|
| 17 |
/**
|
| 18 |
* Constructor
|
| 19 |
*
|
| 20 |
+
* @param int|WP_Post $post Post object or ID.
|
| 21 |
*/
|
| 22 |
public function __construct( $post ) {
|
| 23 |
|
| 33 |
/**
|
| 34 |
* The Subtitle
|
| 35 |
*
|
| 36 |
+
* @param array $args Display parameters.
|
| 37 |
*/
|
| 38 |
public function the_subtitle( $args = '' ) {
|
| 39 |
|
| 40 |
+
echo wp_kses_post( $this->get_subtitle( $args ) );
|
| 41 |
|
| 42 |
}
|
| 43 |
|
| 46 |
*
|
| 47 |
* @uses apply_filters( 'wps_subtitle' )
|
| 48 |
*
|
| 49 |
+
* @param array $args Display parameters.
|
| 50 |
* @return string The filtered subtitle meta value.
|
| 51 |
*/
|
| 52 |
public function get_subtitle( $args = '' ) {
|
| 53 |
|
| 54 |
if ( $this->post_id && $this->is_supported_post_type() ) {
|
| 55 |
|
| 56 |
+
$args = wp_parse_args(
|
| 57 |
+
$args,
|
| 58 |
+
array(
|
| 59 |
+
'before' => '',
|
| 60 |
+
'after' => '',
|
| 61 |
+
)
|
| 62 |
+
);
|
| 63 |
|
| 64 |
$subtitle = apply_filters( 'wps_subtitle', $this->get_raw_subtitle(), get_post( $this->post_id ) );
|
| 65 |
|
| 85 |
if ( is_preview() ) {
|
| 86 |
|
| 87 |
if ( isset( $_GET['preview_id'] ) ) {
|
| 88 |
+
$p = wp_get_post_autosave( $this->post_id );
|
| 89 |
return get_post_meta( $p->ID, $this->get_post_meta_key(), true );
|
| 90 |
}
|
| 91 |
|
| 92 |
+
$revisions = wp_get_post_revisions( $this->post_id );
|
| 93 |
+
|
| 94 |
+
if ( $revisions ) {
|
| 95 |
$p = array_shift( $revisions );
|
| 96 |
return get_post_meta( $p->ID, $this->get_post_meta_key(), true );
|
| 97 |
}
|
|
|
|
| 98 |
}
|
| 99 |
|
| 100 |
return get_post_meta( $this->post_id, $this->get_post_meta_key(), true );
|
| 117 |
/**
|
| 118 |
* Update Subtitle
|
| 119 |
*
|
| 120 |
+
* @param string $subtitle Subtitle.
|
| 121 |
* @return int|bool Meta ID if new entry. True if updated, false if not updated or the same as current value.
|
| 122 |
*/
|
| 123 |
public function update_subtitle( $subtitle ) {
|
| 132 |
*
|
| 133 |
* @since 2.9
|
| 134 |
*
|
| 135 |
+
* @param string $subtitle Subtitle value.
|
| 136 |
* @return boolean
|
| 137 |
*/
|
| 138 |
public function is_current_subtitle( $subtitle ) {
|
| 139 |
|
| 140 |
+
return get_metadata( 'post', $this->post_id, 'wps_subtitle', true ) === $subtitle;
|
| 141 |
|
| 142 |
}
|
| 143 |
|
| 159 |
*
|
| 160 |
* @since 2.9
|
| 161 |
*
|
| 162 |
+
* @param int $revision_id Revision ID.
|
| 163 |
*/
|
| 164 |
public function restore_post_revision( $revision_id ) {
|
| 165 |
|
| 182 |
|
| 183 |
$post_types = $this->get_supported_post_types();
|
| 184 |
|
| 185 |
+
return in_array( get_post_type( $this->post_id ), $post_types, true );
|
| 186 |
|
| 187 |
}
|
| 188 |
|
| 195 |
*/
|
| 196 |
private function get_supported_post_types() {
|
| 197 |
|
| 198 |
+
$post_types = (array) get_post_types(
|
| 199 |
+
array(
|
| 200 |
+
'_builtin' => false,
|
| 201 |
+
)
|
| 202 |
+
);
|
| 203 |
|
| 204 |
$post_types = array_merge( $post_types, array( 'post', 'page', 'revision' ) );
|
| 205 |
|
| 228 |
if ( $this->is_supported_post_type() ) {
|
| 229 |
|
| 230 |
$post_type = get_post_type( $this->post_id );
|
| 231 |
+
$revision = wp_is_post_revision( $this->post_id );
|
| 232 |
|
| 233 |
+
if ( $revision ) {
|
| 234 |
$post_type = get_post_type( $revision );
|
| 235 |
}
|
| 236 |
|
| 247 |
|
| 248 |
// ... edit other post type
|
| 249 |
default:
|
| 250 |
+
$post_types = (array) get_post_types(
|
| 251 |
+
array(
|
| 252 |
+
'_builtin' => false,
|
| 253 |
+
),
|
| 254 |
+
'objects'
|
| 255 |
+
);
|
| 256 |
|
| 257 |
return current_user_can( $post_types[ $post_type ]->cap->edit_post, $this->post_id );
|
| 258 |
|
| 259 |
}
|
|
|
|
| 260 |
}
|
| 261 |
|
| 262 |
return false;
|
plugin/plugin.php
CHANGED
|
@@ -12,22 +12,22 @@ define( 'WPSUBTITLE_URL', plugins_url( WPSUBTITLE_SUBDIR ) );
|
|
| 12 |
define( 'WPSUBTITLE_DIR', plugin_dir_path( __FILE__ ) );
|
| 13 |
|
| 14 |
// Includes
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
|
| 24 |
// Include admin-only functionality
|
| 25 |
if ( is_admin() ) {
|
| 26 |
-
require_once
|
| 27 |
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
|
| 28 |
// Load AJAX functions here if required...
|
| 29 |
} else {
|
| 30 |
-
require_once
|
| 31 |
}
|
| 32 |
}
|
| 33 |
|
|
@@ -90,10 +90,10 @@ class WPSubtitle {
|
|
| 90 |
*/
|
| 91 |
public static function load() {
|
| 92 |
|
| 93 |
-
self::$api
|
| 94 |
-
self::$rest
|
| 95 |
-
self::$wpseo
|
| 96 |
-
self::$seopress
|
| 97 |
self::$woocommerce = new WPSubtitle_WooCommerce();
|
| 98 |
|
| 99 |
self::$api->setup_hooks();
|
|
@@ -122,11 +122,13 @@ class WPSubtitle {
|
|
| 122 |
* @return array Array of supported post types.
|
| 123 |
*/
|
| 124 |
public static function get_supported_post_types() {
|
| 125 |
-
$post_types = (array) get_post_types(
|
| 126 |
-
|
| 127 |
-
|
|
|
|
|
|
|
| 128 |
$post_types = array_merge( $post_types, array( 'post', 'page', 'revision' ) );
|
| 129 |
-
$supported
|
| 130 |
foreach ( $post_types as $post_type ) {
|
| 131 |
if ( post_type_supports( $post_type, 'wps_subtitle' ) ) {
|
| 132 |
$supported[] = $post_type;
|
|
@@ -140,12 +142,12 @@ class WPSubtitle {
|
|
| 140 |
*
|
| 141 |
* @since 2.3
|
| 142 |
*
|
| 143 |
-
* @param string
|
| 144 |
* @return boolean
|
| 145 |
*/
|
| 146 |
public static function is_supported_post_type( $post_type ) {
|
| 147 |
$post_types = self::get_supported_post_types();
|
| 148 |
-
if ( in_array( $post_type, $post_types ) ) {
|
| 149 |
return true;
|
| 150 |
}
|
| 151 |
return false;
|
|
@@ -158,7 +160,7 @@ class WPSubtitle {
|
|
| 158 |
*
|
| 159 |
* @uses WP_Subtitle::get_subtitle()
|
| 160 |
*
|
| 161 |
-
* @param int|object
|
| 162 |
* @return string The filtered subtitle meta value.
|
| 163 |
*/
|
| 164 |
public static function get_the_subtitle( $post = 0 ) {
|
|
@@ -177,7 +179,7 @@ class WPSubtitle {
|
|
| 177 |
*
|
| 178 |
* @uses WP_Subtitle::get_raw_subtitle()
|
| 179 |
*
|
| 180 |
-
* @param int|object
|
| 181 |
* @return string The subtitle meta value.
|
| 182 |
*/
|
| 183 |
public static function _get_post_meta( $post = 0 ) {
|
|
@@ -194,7 +196,7 @@ class WPSubtitle {
|
|
| 194 |
* @since 2.5.x
|
| 195 |
* @internal
|
| 196 |
*
|
| 197 |
-
* @param int
|
| 198 |
* @return string The subtitle meta key.
|
| 199 |
*/
|
| 200 |
public static function _get_post_meta_key( $post_id = 0 ) {
|
| 12 |
define( 'WPSUBTITLE_DIR', plugin_dir_path( __FILE__ ) );
|
| 13 |
|
| 14 |
// Includes
|
| 15 |
+
require_once WPSUBTITLE_DIR . 'includes/class-api.php';
|
| 16 |
+
require_once WPSUBTITLE_DIR . 'includes/subtitle.php';
|
| 17 |
+
require_once WPSUBTITLE_DIR . 'includes/deprecated.php';
|
| 18 |
+
require_once WPSUBTITLE_DIR . 'includes/shortcode.php';
|
| 19 |
+
require_once WPSUBTITLE_DIR . 'includes/rest.php';
|
| 20 |
+
require_once WPSUBTITLE_DIR . 'includes/compat/wordpress-seo.php';
|
| 21 |
+
require_once WPSUBTITLE_DIR . 'includes/compat/seopress.php';
|
| 22 |
+
require_once WPSUBTITLE_DIR . 'includes/compat/woocommerce.php';
|
| 23 |
|
| 24 |
// Include admin-only functionality
|
| 25 |
if ( is_admin() ) {
|
| 26 |
+
require_once WPSUBTITLE_DIR . 'admin/admin.php';
|
| 27 |
if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
|
| 28 |
// Load AJAX functions here if required...
|
| 29 |
} else {
|
| 30 |
+
require_once WPSUBTITLE_DIR . 'admin/pointers.php';
|
| 31 |
}
|
| 32 |
}
|
| 33 |
|
| 90 |
*/
|
| 91 |
public static function load() {
|
| 92 |
|
| 93 |
+
self::$api = new WP_Subtitle_API();
|
| 94 |
+
self::$rest = new WPSubtitle_REST();
|
| 95 |
+
self::$wpseo = new WPSubtitle_WPSEO();
|
| 96 |
+
self::$seopress = new WPSubtitle_SEOPress();
|
| 97 |
self::$woocommerce = new WPSubtitle_WooCommerce();
|
| 98 |
|
| 99 |
self::$api->setup_hooks();
|
| 122 |
* @return array Array of supported post types.
|
| 123 |
*/
|
| 124 |
public static function get_supported_post_types() {
|
| 125 |
+
$post_types = (array) get_post_types(
|
| 126 |
+
array(
|
| 127 |
+
'_builtin' => false,
|
| 128 |
+
)
|
| 129 |
+
);
|
| 130 |
$post_types = array_merge( $post_types, array( 'post', 'page', 'revision' ) );
|
| 131 |
+
$supported = array();
|
| 132 |
foreach ( $post_types as $post_type ) {
|
| 133 |
if ( post_type_supports( $post_type, 'wps_subtitle' ) ) {
|
| 134 |
$supported[] = $post_type;
|
| 142 |
*
|
| 143 |
* @since 2.3
|
| 144 |
*
|
| 145 |
+
* @param string $post_type Post Type.
|
| 146 |
* @return boolean
|
| 147 |
*/
|
| 148 |
public static function is_supported_post_type( $post_type ) {
|
| 149 |
$post_types = self::get_supported_post_types();
|
| 150 |
+
if ( in_array( $post_type, $post_types, true ) ) {
|
| 151 |
return true;
|
| 152 |
}
|
| 153 |
return false;
|
| 160 |
*
|
| 161 |
* @uses WP_Subtitle::get_subtitle()
|
| 162 |
*
|
| 163 |
+
* @param int|object $post Post ID or object.
|
| 164 |
* @return string The filtered subtitle meta value.
|
| 165 |
*/
|
| 166 |
public static function get_the_subtitle( $post = 0 ) {
|
| 179 |
*
|
| 180 |
* @uses WP_Subtitle::get_raw_subtitle()
|
| 181 |
*
|
| 182 |
+
* @param int|object $post Post ID or object.
|
| 183 |
* @return string The subtitle meta value.
|
| 184 |
*/
|
| 185 |
public static function _get_post_meta( $post = 0 ) {
|
| 196 |
* @since 2.5.x
|
| 197 |
* @internal
|
| 198 |
*
|
| 199 |
+
* @param int $post_id Post ID.
|
| 200 |
* @return string The subtitle meta key.
|
| 201 |
*/
|
| 202 |
public static function _get_post_meta_key( $post_id = 0 ) {
|
readme.txt
CHANGED
|
@@ -3,8 +3,8 @@ Contributors: husobj, husani
|
|
| 3 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SLZUF4XJTS4E6
|
| 4 |
Tags: subtitle, content, title, subheading, subhead, alternate title
|
| 5 |
Requires at least: 3.7
|
| 6 |
-
Tested up to: 5.3
|
| 7 |
-
Stable tag: 3.4
|
| 8 |
License: GPLv2
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
| 10 |
|
|
@@ -153,6 +153,10 @@ The plugin is [hosted on GitHub](https://github.com/benhuson/wp-subtitle) and pu
|
|
| 153 |
|
| 154 |
== Changelog ==
|
| 155 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
= 3.4 =
|
| 157 |
* Added support for the SEOPress plugin. Props @chriselkins.
|
| 158 |
* You can now update the subtitle via the REST API. Props @chriselkins.
|
|
@@ -254,6 +258,9 @@ The plugin is [hosted on GitHub](https://github.com/benhuson/wp-subtitle) and pu
|
|
| 254 |
|
| 255 |
== Upgrade Notice ==
|
| 256 |
|
|
|
|
|
|
|
|
|
|
| 257 |
= 3.4 =
|
| 258 |
Added support for the SEOPress plugin and updating the subtitle via the REST API.
|
| 259 |
|
| 3 |
Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=SLZUF4XJTS4E6
|
| 4 |
Tags: subtitle, content, title, subheading, subhead, alternate title
|
| 5 |
Requires at least: 3.7
|
| 6 |
+
Tested up to: 5.9.3
|
| 7 |
+
Stable tag: 3.4.1
|
| 8 |
License: GPLv2
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.txt
|
| 10 |
|
| 153 |
|
| 154 |
== Changelog ==
|
| 155 |
|
| 156 |
+
= 3.4.1 =
|
| 157 |
+
* Security: Resolve XSS issue by improving sanitization when saving subtitle custom field.
|
| 158 |
+
* Pass the current post object to the `wps_subtitle_field_placeholder` filter. Props [Dominik Schilling](https://github.com/ocean90).
|
| 159 |
+
|
| 160 |
= 3.4 =
|
| 161 |
* Added support for the SEOPress plugin. Props @chriselkins.
|
| 162 |
* You can now update the subtitle via the REST API. Props @chriselkins.
|
| 258 |
|
| 259 |
== Upgrade Notice ==
|
| 260 |
|
| 261 |
+
= 3.4.1 =
|
| 262 |
+
Resolve XSS issue by improving sanitization when saving subtitle custom field.
|
| 263 |
+
|
| 264 |
= 3.4 =
|
| 265 |
Added support for the SEOPress plugin and updating the subtitle via the REST API.
|
| 266 |
|
wp-subtitle.php
CHANGED
|
@@ -4,7 +4,7 @@
|
|
| 4 |
Plugin Name: WP Subtitle
|
| 5 |
Plugin URI: http://wordpress.org/plugins/wp-subtitle/
|
| 6 |
Description: Adds a subtitle field to pages and posts. Possible to add support for custom post types.
|
| 7 |
-
Version: 3.4
|
| 8 |
Author: Ben Huson, Husani Oakley
|
| 9 |
Author URI: https://github.com/benhuson/wp-subtitle
|
| 10 |
License: GPLv2
|
|
@@ -31,4 +31,4 @@ along with this program; if not, write to the Free Software
|
|
| 31 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
| 32 |
*/
|
| 33 |
|
| 34 |
-
require_once
|
| 4 |
Plugin Name: WP Subtitle
|
| 5 |
Plugin URI: http://wordpress.org/plugins/wp-subtitle/
|
| 6 |
Description: Adds a subtitle field to pages and posts. Possible to add support for custom post types.
|
| 7 |
+
Version: 3.4.1
|
| 8 |
Author: Ben Huson, Husani Oakley
|
| 9 |
Author URI: https://github.com/benhuson/wp-subtitle
|
| 10 |
License: GPLv2
|
| 31 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
| 32 |
*/
|
| 33 |
|
| 34 |
+
require_once plugin_dir_path( __FILE__ ) . 'plugin/plugin.php';
|
