Commit realizado el 12:13:52 08-04-2024
This commit is contained in:
@@ -0,0 +1,318 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user