WowDevs\DynamicTags). * * Everything Elementor stores or looks up by string is deliberately untouched: * the tag names (`sky-addons-post-title`…) and the group ids (`sky-addons-post`…) * are exactly the ones Sky Addons uses. A page built with Sky Addons keeps working * when it is deactivated and this plugin takes over, because the tag name saved in * the page settings still resolves. **Never rename a tag or a group id here** — that * silently drops the dynamic value from every page already using it. * * Group titles are this plugin's own label, since Sky Addons is not installed * whenever this code runs (see wowdevs_dt_load_plugin()). */ class Manager { /** * List of dynamic tags. Add new tags here to automatically register them. * * @var array */ private $dynamic_tags_text = [ // Post Tags 'post-title' => 'Dynamic_Tag_Post_Title', 'post-id' => 'Dynamic_Tag_Post_ID', 'post-slug' => 'Dynamic_Tag_Post_Slug', 'post-date' => 'Dynamic_Tag_Post_Date', 'post-time' => 'Dynamic_Tag_Post_Time', 'post-author' => 'Dynamic_Tag_Post_Author', 'post-comments' => 'Dynamic_Tag_Post_Comments', 'post-excerpt' => 'Dynamic_Tag_Post_Excerpt', 'post-content' => 'Dynamic_Tag_Post_Content', 'post-terms' => 'Dynamic_Tag_Post_Terms', 'post-status' => 'Dynamic_Tag_Post_Status', 'post-type' => 'Dynamic_Tag_Post_Type', 'post-custom-field' => 'Dynamic_Tag_Post_Custom_Field', 'post-featured-image' => 'Dynamic_Tag_Post_Featured_Image', // Site Tags 'site-title' => 'Dynamic_Tag_Site_Title', 'site-tagline' => 'Dynamic_Tag_Site_Tagline', 'current-date-time' => 'Dynamic_Tag_Current_Date_Time', 'request-parameter' => 'Dynamic_Tag_Request_Parameter', 'shortcode' => 'Dynamic_Tag_Shortcode', // Archive Tags 'archive-title' => 'Dynamic_Tag_Archive_Title', 'archive-description' => 'Dynamic_Tag_Archive_Description', 'archive-meta' => 'Dynamic_Tag_Archive_Meta', // Term Tags 'term-id' => 'Dynamic_Tag_Term_ID', 'term-title' => 'Dynamic_Tag_Term_Title', 'term-description' => 'Dynamic_Tag_Term_Description', 'term-slug' => 'Dynamic_Tag_Term_Slug', 'term-count' => 'Dynamic_Tag_Term_Count', 'term-meta' => 'Dynamic_Tag_Term_Meta', // User Tags 'user-info' => 'Dynamic_Tag_User_Info', 'user-meta' => 'Dynamic_Tag_User_Meta', // Search 'search-query' => 'Dynamic_Tag_Search_Query', 'search-results-count' => 'Dynamic_Tag_Search_Results_Count', ]; private $dynamic_tags_url = [ // Post Tags 'post-url' => 'Dynamic_Tag_Post_URL', 'post-terms-url' => 'Dynamic_Tag_Post_Terms_URL', 'post-author-url' => 'Dynamic_Tag_Post_Author_URL', 'post-comments-url' => 'Dynamic_Tag_Post_Comments_URL', 'post-featured-image-url' => 'Dynamic_Tag_Post_Featured_Image_URL', 'post-navigation-url' => 'Dynamic_Tag_Post_Navigation_URL', // Archive Tags 'archive-url' => 'Dynamic_Tag_Archive_URL', // Site Tags 'site-url' => 'Dynamic_Tag_Site_URL', // Term Tags 'term-url' => 'Dynamic_Tag_Term_URL', // User Tags 'user-url' => 'Dynamic_Tag_User_URL', 'login-logout-url' => 'Dynamic_Tag_Login_Logout_URL', // Media Tags 'attachment-url' => 'Dynamic_Tag_Attachment_URL', ]; private $dynamic_tags_image = [ // Post Tags 'post-featured-image' => 'Dynamic_Tag_Post_Featured_Image_Data', 'post-author-avatar' => 'Dynamic_Tag_Post_Author_Avatar', 'post-custom-field-image' => 'Dynamic_Tag_Post_Custom_Field_Image', // Archive Tags 'archive-meta-image' => 'Dynamic_Tag_Archive_Meta_Image', // Site Tags 'site-logo' => 'Dynamic_Tag_Site_Logo', 'site-icon' => 'Dynamic_Tag_Site_Icon', // User Tags 'user-avatar' => 'Dynamic_Tag_User_Avatar', ]; private $dynamic_tags_woocommerce_text = [ // Product Tags 'product-attribute' => 'Dynamic_Tag_Product_Attribute', 'product-description' => 'Dynamic_Tag_Product_Description', 'product-price' => 'Dynamic_Tag_Product_Price', 'product-purchase-note' => 'Dynamic_Tag_Product_Purchase_Note', 'product-rating' => 'Dynamic_Tag_Product_Rating', 'product-sale' => 'Dynamic_Tag_Product_Sale', 'product-shipping' => 'Dynamic_Tag_Product_Shipping', 'product-sku' => 'Dynamic_Tag_Product_SKU', 'product-stock' => 'Dynamic_Tag_Product_Stock', 'product-terms' => 'Dynamic_Tag_Product_Terms', 'product-title' => 'Dynamic_Tag_Product_Title', 'product-type' => 'Dynamic_Tag_Product_Type', ]; private $dynamic_tags_woocommerce_url = [ 'product-url' => 'Dynamic_Tag_Product_URL', 'product-add-to-cart-url' => 'Dynamic_Tag_Product_Add_To_Cart_URL', 'product-term-url' => 'Dynamic_Tag_Product_Term_URL', 'product-review-url' => 'Dynamic_Tag_Product_Review_URL', 'product-checkout-url' => 'Dynamic_Tag_Product_Checkout_URL', 'product-back-to-shop-url' => 'Dynamic_Tag_Product_Back_To_Shop_URL', 'product-archive-url' => 'Dynamic_Tag_Product_Archive_URL', 'product-term-archive-url' => 'Dynamic_Tag_Product_Term_Archive_URL', ]; private $dynamic_tags_woocommerce_image = [ 'product-featured-image' => 'Dynamic_Tag_Product_Featured_Image', 'product-gallery-image' => 'Dynamic_Tag_Product_Gallery_Image', 'product-term-image' => 'Dynamic_Tag_Product_Term_Image', ]; private $dynamic_tags_acf = [ 'acf-text' => 'Dynamic_Tag_ACF_Text', 'acf-url' => 'Dynamic_Tag_ACF_URL', 'acf-image' => 'Dynamic_Tag_ACF_Image', 'acf-gallery' => 'Dynamic_Tag_ACF_Gallery', 'acf-date-time' => 'Dynamic_Tag_ACF_Date_Time', ]; public function __construct() { add_action( 'elementor/dynamic_tags/register', [ $this, 'register_dynamic_tag_group' ], 1 ); add_action( 'elementor/dynamic_tags/register', [ $this, 'register_dynamic_tag' ] ); } /** * Group ids are Sky Addons' own and must not change — a tag whose group is unknown * to Elementor is dropped from the picker. Only the titles are this plugin's. * * @param \Elementor\Core\DynamicTags\Manager $dynamic_tags_manager */ public function register_dynamic_tag_group( $dynamic_tags_manager ) { $groups = [ 'sky-addons-post' => esc_html__( 'Dynamic Tags - Post', 'wowdevs-dynamic-tags' ), 'sky-addons-site' => esc_html__( 'Dynamic Tags - Site', 'wowdevs-dynamic-tags' ), 'sky-addons-archive' => esc_html__( 'Dynamic Tags - Archive', 'wowdevs-dynamic-tags' ), 'sky-addons-term' => esc_html__( 'Dynamic Tags - Term', 'wowdevs-dynamic-tags' ), 'sky-addons-user' => esc_html__( 'Dynamic Tags - User', 'wowdevs-dynamic-tags' ), 'sky-addons-search' => esc_html__( 'Dynamic Tags - Search', 'wowdevs-dynamic-tags' ), 'sky-addons-media' => esc_html__( 'Dynamic Tags - Media', 'wowdevs-dynamic-tags' ), ]; if ( class_exists( 'WooCommerce' ) ) { $groups['sky-addons-woocommerce'] = esc_html__( 'Dynamic Tags - WooCommerce', 'wowdevs-dynamic-tags' ); } if ( class_exists( 'ACF' ) ) { $groups['sky-addons-acf'] = esc_html__( 'Dynamic Tags - ACF', 'wowdevs-dynamic-tags' ); } foreach ( $groups as $group_id => $title ) { $dynamic_tags_manager->register_group( $group_id, [ 'title' => $title, ] ); } } public function register_dynamic_tag( $dynamic_tags_manager ) { require_once WOWDEVS_DT_INC_PATH . 'traits/utils-trait.php'; $this->register_text_tags( $dynamic_tags_manager ); $this->register_url_tags( $dynamic_tags_manager ); $this->register_image_tags( $dynamic_tags_manager ); $this->register_woocommerce_text_tags( $dynamic_tags_manager ); $this->register_woocommerce_url_tags( $dynamic_tags_manager ); $this->register_woocommerce_image_tags( $dynamic_tags_manager ); $this->register_acf_tags( $dynamic_tags_manager ); } /** * Requires one tag file and registers its class, skipping anything missing. * * @param \Elementor\Core\DynamicTags\Manager $dynamic_tags_manager Elementor's tag registry. * @param array $tags Tag slug => class name, without the namespace. * @param string $sub_path Folder under includes/tags/, e.g. 'text' or 'woocommerce/url'. * @param string $sub_namespace Namespace under WowDevs\DynamicTags\Tags, e.g. 'Text'. */ private function register_tags( $dynamic_tags_manager, $tags, $sub_path, $sub_namespace ) { foreach ( $tags as $tag => $class ) { $class = __NAMESPACE__ . '\\Tags\\' . $sub_namespace . '\\' . $class; $file = WOWDEVS_DT_INC_PATH . 'tags/' . $sub_path . '/' . $tag . '.php'; if ( ! file_exists( $file ) ) { continue; } require_once $file; if ( class_exists( $class ) ) { $dynamic_tags_manager->register( new $class() ); } } } private function register_text_tags( $dynamic_tags_manager ) { $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_text, 'text', 'Text' ); } private function register_url_tags( $dynamic_tags_manager ) { $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_url, 'url', 'Url' ); } private function register_image_tags( $dynamic_tags_manager ) { $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_image, 'image', 'Image' ); } private function register_woocommerce_text_tags( $dynamic_tags_manager ) { if ( ! class_exists( 'WooCommerce' ) ) { return; } $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_woocommerce_text, 'woocommerce/text', 'Woocommerce\\Text' ); } private function register_woocommerce_url_tags( $dynamic_tags_manager ) { if ( ! class_exists( 'WooCommerce' ) ) { return; } $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_woocommerce_url, 'woocommerce/url', 'Woocommerce\\Url' ); } private function register_woocommerce_image_tags( $dynamic_tags_manager ) { if ( ! class_exists( 'WooCommerce' ) ) { return; } $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_woocommerce_image, 'woocommerce/image', 'Woocommerce\\Image' ); } private function register_acf_tags( $dynamic_tags_manager ) { if ( ! class_exists( 'ACF' ) ) { return; } $this->register_tags( $dynamic_tags_manager, $this->dynamic_tags_acf, 'acf', 'Acf' ); } }