You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
319 lines
7.3 KiB
PHTML
319 lines
7.3 KiB
PHTML
8 months ago
|
<?php
|
||
|
/**
|
||
|
* Variable replacer.
|
||
|
*
|
||
|
* Replace '%variables%' in strings based on context.
|
||
|
*
|
||
|
* @since 1.0.33
|
||
|
* @package RankMath
|
||
|
* @subpackage RankMath\Replace_Variables
|
||
|
* @author Rank Math <support@rankmath.com>
|
||
|
*/
|
||
|
|
||
|
namespace RankMath\Replace_Variables;
|
||
|
|
||
|
use RankMath\Helper;
|
||
|
use RankMath\Helpers\Str;
|
||
|
use RankMath\Helpers\Param;
|
||
|
use RankMath\Admin\Admin_Helper;
|
||
|
|
||
|
defined( 'ABSPATH' ) || exit;
|
||
|
|
||
|
/**
|
||
|
* Manager class.
|
||
|
*/
|
||
|
class Manager extends Post_Variables {
|
||
|
|
||
|
/**
|
||
|
* Register variable replacements.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $replacements = [];
|
||
|
|
||
|
/**
|
||
|
* Removed non replaced variables.
|
||
|
*
|
||
|
* @var bool
|
||
|
*/
|
||
|
public $remove_non_replaced = true;
|
||
|
|
||
|
/**
|
||
|
* Is variable setup.
|
||
|
*
|
||
|
* @var bool
|
||
|
*/
|
||
|
private $is_setup = false;
|
||
|
|
||
|
/**
|
||
|
* Hold arguments.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
public $args = [];
|
||
|
|
||
|
/**
|
||
|
* Hold arguments temporarily.
|
||
|
*
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $tmp_args = [];
|
||
|
|
||
|
/**
|
||
|
* Class constructor.
|
||
|
*/
|
||
|
public function __construct() {
|
||
|
$action = is_admin() ? 'admin_enqueue_scripts' : 'wp';
|
||
|
$priority = is_admin() ? 5 : 25;
|
||
|
$this->action( $action, 'setup', $priority );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Register variables
|
||
|
*
|
||
|
* For developers see rank_math_register_var_replacement().
|
||
|
*
|
||
|
* @param string $id Uniquer ID of variable, for example custom.
|
||
|
* @param array $args Array with additional name, description, variable and example values for the variable.
|
||
|
* @param mixed $callback Replacement callback. Should return value, not output it.
|
||
|
*
|
||
|
* @return bool Replacement was registered successfully or not.
|
||
|
*/
|
||
|
public function register_replacement( $id, $args = [], $callback = false ) {
|
||
|
if ( ! $this->is_unique_id( $id ) ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$variable = Variable::from( $id, $args );
|
||
|
$variable->set_callback( $callback );
|
||
|
|
||
|
$this->replacements[ $id ] = $variable;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check if variable ID is valid and unique before further processing.
|
||
|
*
|
||
|
* @param string $id Variable ID.
|
||
|
*
|
||
|
* @return bool Whether the variable is valid or not.
|
||
|
*/
|
||
|
private function is_unique_id( $id ) {
|
||
|
if ( false === preg_match( '`^[A-Z0-9_-]+$`i', $id ) ) {
|
||
|
trigger_error( esc_html__( 'Variable names can only contain alphanumeric characters, underscores and dashes.', 'rank-math' ), E_USER_WARNING );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if ( isset( $this->replacements[ $id ] ) ) {
|
||
|
trigger_error( esc_html__( 'The variable has already been registered.', 'rank-math' ), E_USER_WARNING );
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Should we setup variables or not.
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
private function should_we_setup() {
|
||
|
if ( Helper::is_ux_builder() ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
global $wp_customize;
|
||
|
if ( isset( $wp_customize ) || $this->is_setup ) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
$current_screen = \function_exists( 'get_current_screen' ) ? get_current_screen() : false;
|
||
|
if (
|
||
|
$current_screen instanceof \WP_Screen &&
|
||
|
\in_array( $current_screen->base, [ 'themes' ], true )
|
||
|
) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set up replacement variables.
|
||
|
*/
|
||
|
public function setup() {
|
||
|
if ( ! $this->should_we_setup() ) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
// Variable setuped.
|
||
|
$this->is_setup = true;
|
||
|
|
||
|
// Internal variables.
|
||
|
$current_screen = \function_exists( 'get_current_screen' ) ? get_current_screen() : false;
|
||
|
if ( $current_screen instanceof \WP_Screen ) {
|
||
|
$screen_base = $current_screen->base;
|
||
|
$this->is_post_edit = is_admin() && 'post' === $screen_base;
|
||
|
$this->is_term_edit = is_admin() && 'term' === $screen_base;
|
||
|
$this->is_user_edit = is_admin() && ( 'profile' === $screen_base || 'user-edit' === $screen_base );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Filter: strip variables which don't have a replacement.
|
||
|
*
|
||
|
* @param bool $final
|
||
|
*/
|
||
|
$this->remove_non_replaced = $this->do_filter( 'vars/remove_nonreplaced', true );
|
||
|
|
||
|
// Setup internal variables.
|
||
|
$this->setup_basic_variables();
|
||
|
$this->setup_post_variables();
|
||
|
$this->setup_term_variables();
|
||
|
$this->setup_author_variables();
|
||
|
$this->setup_advanced_variables();
|
||
|
|
||
|
// Setup custom fields.
|
||
|
if ( $this->is_post_edit || $this->is_term_edit || $this->is_user_edit ) {
|
||
|
Helper::add_json( 'customFields', $this->get_custom_fields() );
|
||
|
Helper::add_json( 'customTerms', $this->get_custom_taxonomies() );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Action: 'rank_math/vars/register_extra_replacements' - Allows adding extra variables.
|
||
|
*/
|
||
|
$this->do_action( 'vars/register_extra_replacements' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Setup JSON for use in ui.
|
||
|
*/
|
||
|
public function setup_json() {
|
||
|
$json = [];
|
||
|
|
||
|
foreach ( $this->replacements as $id => $variable ) {
|
||
|
$json[ $id ] = $variable->to_array();
|
||
|
}
|
||
|
|
||
|
Helper::add_json( 'variables', $this->do_filter( 'vars/replacements', $json ) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get replacements.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function get_replacements() {
|
||
|
return $this->replacements;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set arguments.
|
||
|
*
|
||
|
* @param array $args The object some of the replacement values might come from,
|
||
|
* could be a post, taxonomy or term.
|
||
|
*/
|
||
|
public function set_arguments( $args = [] ) {
|
||
|
if ( ! empty( $args ) ) {
|
||
|
$this->tmp_args = $this->args;
|
||
|
$this->args = $args;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Reset arguments.
|
||
|
*/
|
||
|
public function reset_arguments() {
|
||
|
$this->args = $this->tmp_args;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get custom fields.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function get_custom_fields() {
|
||
|
$metas = [];
|
||
|
|
||
|
if ( $this->is_user_edit ) {
|
||
|
global $user_id;
|
||
|
$metas = get_metadata( 'user', $user_id );
|
||
|
} elseif ( $this->is_post_edit ) {
|
||
|
$metas = get_metadata( 'post', $this->args->ID );
|
||
|
} elseif ( $this->is_term_edit ) {
|
||
|
$term_id = Param::request( 'tag_ID', 0, FILTER_VALIDATE_INT );
|
||
|
$metas = get_metadata( 'term', $term_id );
|
||
|
}
|
||
|
|
||
|
if ( empty( $metas ) ) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
$json = [];
|
||
|
foreach ( $metas as $meta_key => $meta_value ) {
|
||
|
if ( Str::starts_with( '_', $meta_key ) || Str::starts_with( 'rank_math_', $meta_key ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$json[ $meta_key ] = $meta_value[0];
|
||
|
}
|
||
|
|
||
|
return $json;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get custom taxonomies.
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
private function get_custom_taxonomies() {
|
||
|
$taxonomies = get_post_taxonomies( $this->args->ID );
|
||
|
if ( empty( $taxonomies ) ) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
$json = [];
|
||
|
foreach ( $taxonomies as $taxonomy ) {
|
||
|
if ( in_array( $taxonomy, [ 'category', 'post_tag' ], true ) ) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
$name = ucwords( str_replace( [ '_', '-' ], ' ', $taxonomy ) );
|
||
|
/* translators: Taxonomy name. */
|
||
|
$title = sprintf( __( '%s Title', 'rank-math' ), $name );
|
||
|
/* translators: Taxonomy name. */
|
||
|
$desc = sprintf( __( '%s Description', 'rank-math' ), $name );
|
||
|
|
||
|
$this->register_replacement(
|
||
|
"term_{$taxonomy}",
|
||
|
[
|
||
|
'name' => $title,
|
||
|
'description' => esc_html__( 'Custom Term title.', 'rank-math' ),
|
||
|
'variable' => "customterm({$taxonomy})",
|
||
|
'example' => $title,
|
||
|
],
|
||
|
[ $this, 'get_custom_term' ]
|
||
|
);
|
||
|
|
||
|
$this->register_replacement(
|
||
|
"term_{$taxonomy}_desc",
|
||
|
[
|
||
|
'name' => $desc,
|
||
|
'description' => esc_html__( 'Custom Term description.', 'rank-math' ),
|
||
|
'variable' => "customterm_desc({$taxonomy})",
|
||
|
'example' => $desc,
|
||
|
],
|
||
|
[ $this, 'get_custom_term_desc' ]
|
||
|
);
|
||
|
|
||
|
$term = $this->get_custom_term( $taxonomy );
|
||
|
$term_desc = $this->get_custom_term_desc( $taxonomy );
|
||
|
|
||
|
$json[ $taxonomy ] = $term ? $term : $title;
|
||
|
$json[ "{$taxonomy}_desc" ] = $term_desc ? $term_desc : $desc;
|
||
|
}
|
||
|
|
||
|
return $json;
|
||
|
}
|
||
|
}
|