319 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?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;
 | 
						|
	}
 | 
						|
}
 |