'global_shortcode_url', 'thrv_dynamic_data_request' => 'request_data_shortcode', 'thrv_dynamic_data_date' => 'date_shortcode', 'thrv_dynamic_data_content' => 'content_shortcode', 'thrv_dynamic_data_user' => 'user_data_shortcode', 'thrv_dynamic_data_source' => 'source_shortcode', 'thrv_dynamic_data_user_acf' => 'acf_user_field', ); public function __construct() { add_filter( 'tcb_content_allowed_shortcodes', array( $this, 'allowed_shortcodes' ) ); add_filter( 'tcb_dynamiclink_data', array( $this, 'links_shortcodes' ) ); add_filter( 'tcb_inline_shortcodes', array( $this, 'tcb_inline_shortcodes' ), 99, 1 ); $this->add_shortcodes(); } public function add_shortcodes() { foreach ( static::$dynamic_shortcodes as $shortcode => $func ) { $function = array( $this, $func ); add_shortcode( $shortcode, static function ( $attr ) use ( $function ) { $output = call_user_func_array( $function, func_get_args() ); return TVD_Global_Shortcodes::maybe_link_wrap( $output, $attr ); } ); } } /** * Checks if shortcode content needs to be wrapped in a link (if a custom json-encoded attribute exists in the shortcode) * * @param string $shortcode_content * @param array $attr * * @return string */ public static function maybe_link_wrap( $shortcode_content, $attr ) { /** * If a static link is detected in config, we need to wrap $content in that link (only if a link doesn't already exist in $shortcode_content ..) */ if ( $shortcode_content && ! empty( $attr['static-link'] ) ) { $link_attr = json_decode( htmlspecialchars_decode( $attr['static-link'] ), true ); if ( strpos( $shortcode_content, '' ) === false ) { if ( ! empty( $link_attr ) && ! empty( $link_attr['href'] ) ) { /* replacement for shortcode open "[" */ if ( strpos( $link_attr['href'], '((' ) === 0 ) { $link_attr['href'] = str_replace( array( '((', '))' ), array( '[', ']' ), $link_attr['href'] ); $link_attr['href'] = do_shortcode( $link_attr['href'] ); } /* put the brackets back in the title attribute if they were replaced before */ if ( ! empty( $link_attr['title'] ) && strpos( $link_attr['title'], '((' ) !== false ) { $link_attr['title'] = str_replace( array( '((', '))' ), array( '[', ']', ), $link_attr['title'] ); } $attributes = array(); foreach ( $link_attr as $attr_name => $value ) { $attributes[] = ( $attr_name === 'className' ? 'class' : $attr_name ) . '="' . esc_attr( $value ) . '"'; } $shortcode_content = '' . $shortcode_content . ''; } } elseif ( extension_loaded( 'dom' ) && isset( $link_attr['className'] ) && function_exists( 'mb_convert_encoding' ) ) { /** * For elements already containing a link just add the old classes (e.g. global styles) */ $dom = new DOMDocument; @$dom->loadHTML( mb_convert_encoding( $shortcode_content, 'HTML-ENTITIES', 'UTF-8' ) ); $dom->encoding = 'UTF-8'; $items = $dom->getElementsByTagName( 'a' ); for ( $i = 0; $i < $items->length; $i ++ ) { $link = $items->item( $i ); if ( $link ) { $link->setAttribute( 'class', $link_attr['className'] ); if ( isset( $link_attr['data-css'] ) ) { $link->setAttribute( 'data-css', $link_attr['data-css'] ); } } } $body = $dom->getElementsByTagName( 'body' ); if ( $body && $body->length ) { $shortcode_content = ''; foreach ( $body[0]->childNodes as $child ) { $shortcode_content .= $dom->saveHTML( $child ); } } else { $shortcode_content = $dom->saveHTML(); } } } return $shortcode_content; } public function tcb_inline_shortcodes( $shortcodes ) { return array_merge_recursive( TVD_Global_Shortcodes::get_inline_shortcodes(), $shortcodes ); } public static function get_inline_shortcodes() { $inline_shortcodes = array(); $shortcodes_without_params = array( /* Content */ 'the_ID' => array( 'name' => __( 'Post ID', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_content', 'fn' => 'content_shortcode', 'group' => 'Content', ), 'the_title' => array( 'name' => __( 'Post title', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_content', 'fn' => 'content_shortcode', 'group' => 'Content', ), 'post_type' => array( 'name' => __( 'Post type', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_content', 'fn' => 'content_shortcode', 'group' => 'Content', ), 'permalink' => array( 'name' => __( 'Post URL', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_content', 'fn' => 'content_shortcode', 'group' => 'Content', ), /* Time & date*/ 'd M Y' => array( 'name' => esc_html__( 'Date (14 Aug 2029)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'd.n.Y' => array( 'name' => esc_html__( 'Date (14.8.2029)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'd-m-Y' => array( 'name' => esc_html__( 'Date (14-08-2029)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'd/m/Y' => array( 'name' => esc_html__( 'Date (14/08/2029)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'G:i:s' => array( 'name' => esc_html__( 'Time (23:59:59)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'G:i' => array( 'name' => esc_html__( 'Time (23:59)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'd' => array( 'name' => esc_html__( 'Day (01–31)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'jS' => array( 'name' => esc_html__( 'Day (1st, 2nd, 15th - 31st)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'l' => array( 'name' => esc_html__( 'Day of the week (Monday)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'D' => array( 'name' => esc_html__( 'Day of the week (Mon)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'm' => array( 'name' => esc_html__( 'Month (01-12)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'F' => array( 'name' => esc_html__( 'Month (January - December)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'M' => array( 'name' => esc_html__( 'Month (Jan – Dec)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), 'Y' => array( 'name' => esc_html__( 'Year (2029)', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_date', 'fn' => 'date_shortcode', 'group' => 'Time & date', ), ); $resources = array( 'get' => __( 'URL QueryString', 'thrive-dash' ), 'post' => __( 'POST variable', 'thrive-dash' ), 'cookie' => __( 'Cookie', 'thrive-dash' ), ); $shortcodes_with_default = array( /* User Data */ 'username' => array( 'name' => __( 'WordPress username', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', 'link' => __( 'Link to user profile', 'thrive-dash' ), ), 'user_email' => array( 'name' => __( 'WordPress user email', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'role' => array( 'name' => __( 'WordPress user role', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'first_name' => array( 'name' => __( 'WordPress user first name', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', 'link' => __( 'Link to user profile', 'thrive-dash' ), ), 'last_name' => array( 'name' => __( 'WordPress user last name', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', 'link' => __( 'Link to user profile', 'thrive-dash' ), ), 'nickname' => array( 'name' => __( 'WordPress user nickname', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'display_name' => array( 'name' => __( 'WordPress user public name', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'website' => array( 'name' => __( 'WordPress user website', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'user_bio' => array( 'name' => __( 'WordPress user bio', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'ip' => array( 'name' => __( 'IP', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), 'browser' => array( 'name' => __( 'Browser', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_user', 'fn' => 'user_data_shortcode', 'group' => 'User data', ), /* Source */ 'HTTP_REFERER' => array( 'name' => __( 'Referring URL', 'thrive-dash' ), 'shortcode' => 'thrv_dynamic_data_source', 'fn' => 'source_shortcode', 'group' => 'Source', ), ); if ( tvd_has_external_fields_plugins() ) { // if is acf plugin active, run through all of them and update the custom fields for the user foreach ( tvd_get_acf_user_external_fields() as $field ) { $shortcodes_with_default[ $field['name'] ] = array( 'name' => $field['label'], 'shortcode' => 'thrv_dynamic_data_user_acf', 'fn' => 'acf_user_field', 'group' => 'User data', ); } } foreach ( $shortcodes_with_default as $key => $data ) { $shortcode = array( 'name' => $data['name'], 'option' => $data['name'], 'value' => $data['shortcode'], 'extra_param' => $key, 'input' => array( 'default' => array( 'type' => 'input', 'label' => __( 'Default Value', 'thrive-dash' ), 'value' => '', ), 'id' => array( 'extra_options' => array(), 'real_data' => array( $key => call_user_func( 'TVD_Global_Shortcodes::' . $data['fn'], array( 'id' => $key ) ), ), 'type' => 'hidden', 'value' => $key, ), ), ); /* Support shortcodes link*/ if ( isset( $data['link'] ) ) { $shortcode['input']['link'] = array( 'type' => 'checkbox', 'label' => $data['link'], 'value' => true, ); } $inline_shortcodes[ $data['group'] ][] = $shortcode; } foreach ( $shortcodes_without_params as $key => $data ) { $shortcode = array( 'name' => $data['name'], 'option' => $data['name'], 'value' => $data['shortcode'], 'extra_param' => $key, 'input' => array( 'id' => array( 'extra_options' => array(), 'real_data' => array( $key => call_user_func( 'TVD_Global_Shortcodes::' . $data['fn'], array( 'id' => $key ) ), ), 'type' => 'hidden', 'value' => $key, ), ), ); $inline_shortcodes[ $data['group'] ][] = $shortcode; } foreach ( $resources as $key => $name ) { $inline_shortcodes['Request data'][] = array( 'name' => $name, 'option' => $name, 'value' => 'thrv_dynamic_data_request', 'extra_param' => $key, 'input' => array( 'var_name' => array( 'type' => 'input', 'label' => __( 'Variable name', 'thrive-dash' ), 'value' => '', ), 'default' => array( 'type' => 'input', 'label' => __( 'Default Value', 'thrive-dash' ), 'value' => '', ), 'id' => array( 'extra_options' => array(), 'real_data' => array( $key => TVD_Global_Shortcodes::request_data_shortcode( array( 'id' => $key, 'var_name' => '', ) ), ), 'type' => 'hidden', 'value' => $key, ), ), ); } return $inline_shortcodes; } /** * Filter allowed shortcodes for tve_do_wp_shortcodes * * @param $shortcodes * * @return array */ public function allowed_shortcodes( $shortcodes ) { return array_merge( $shortcodes, array_keys( TVD_Global_Shortcodes::$dynamic_shortcodes ) ); } /** * Add global shortcodes to be used in dynamic links * * @param $links * * @return mixed */ public function links_shortcodes( $links ) { $global_links = array(); foreach ( $this->global_data() as $index => $value ) { $value['id'] = $index; $global_links[] = $value; } $links['Site'] = array( 'links' => array( $global_links ), 'shortcode' => 'thrive_global_shortcode_url', ); return $links; } /** * Global data related to the site * * @return array */ public function global_data() { // phpcs:disable return apply_filters( 'tvd_global_data', array( array( 'name' => __( 'Homepage', 'thrive-dash' ), 'url' => get_home_url(), 'show' => true, ), array( 'name' => __( 'Blog', 'thrive-dash' ), 'url' => get_option( 'page_for_posts' ) ? get_permalink( get_option( 'page_for_posts' ) ) : get_home_url(), 'show' => true, ), array( 'name' => __( 'RSS Feed', 'thrive-dash' ), 'url' => get_home_url() . '/feed', 'show' => true, ), array( 'name' => __( 'Login', 'thrive-dash' ), 'url' => wp_login_url(), 'show' => true, ), array( 'name' => __( 'Logout', 'thrive-dash' ), 'url' => wp_logout_url(), 'show' => true, ), ) ); // phpcs:enable } /** * Replace the shortcode with its content * * @param $args * * @return mixed|string */ public function global_shortcode_url( $args ) { $data = ''; if ( isset( $args['id'] ) ) { $groups = $this->global_data(); $id = (int) $args['id']; $data = empty( $groups[ $id ] ) ? '' : $groups[ $id ]['url']; } if ( isset( $args['logout-redirect'] ) ) { $data .= '&redirect_to=' . $args['logout-redirect']; } return $data; } /** * Shortcode render for user data * * @param $args * * @return mixed|string */ public static function user_data_shortcode( $args ) { $user_data = tve_current_user_data(); $value = ''; if ( isset( $args['id'] ) ) { if ( $args['id'] === 'browser' ) { $value = ''; /* Replace this with JS because PHP get_browser doesnt work all the time */ } if ( isset( $user_data[ $args['id'] ] ) ) { $value = $user_data[ $args['id'] ]; if ( $args['id'] === 'website' ) { /* create link with user website */ $value = sprintf( '%s', $value, $value ); } elseif ( isset( $args['link'] ) && $args['link'] === '1' ) { $value = sprintf( '%s', $user_data['edit_url'], $value ); } } } if ( empty( $value ) && isset( $args['default'] ) ) { $value = $args['default']; } return $value; } /** * Shortcode render for user data from acf * * @param $args * * @return mixed|string */ public static function acf_user_field( $args ) { $value = ''; if ( tvd_has_external_fields_plugins() ) { $value = get_field( $args['id'], 'user_' . get_current_user_id() ); if ( empty( $value ) && isset( $args['default'] ) ) { $value = $args['default']; } } return $value; } /** * Shortcode render for post data * * @param $args * * @return mixed|string */ public static function content_shortcode( $args ) { $value = ''; global $post; if ( is_singular() || ( wp_doing_ajax() && ! empty( $post ) ) ) { if ( isset( $args['id'] ) ) { $func = "get_{$args['id']}"; if ( function_exists( $func ) ) { $value = $func(); } } if ( empty( $value ) && isset( $args['default'] ) ) { $value = $args['default']; } } return $value; } public static function date_shortcode( $args ) { /** * The hour should be in 24h format */ $format = str_replace( 'g', 'G', $args['id'] ); if ( function_exists( 'wp_date' ) ) { $result = wp_date( $format ); } else { $result = date_i18n( $format ); } return trim( $result ); } /** * Shortcode render for data from page source * * @param $args * * @return mixed|string */ public static function source_shortcode( $args ) { $allowed = array( 'HTTP_REFERER' ); $value = ''; if ( isset( $args['id'], $_SERVER[ $args['id'] ] ) && in_array( $args['id'], $allowed, true ) ) { $value = sanitize_text_field( $_SERVER[ $args['id'] ] ); } if ( empty( $value ) && isset( $args['default'] ) ) { $value = $args['default']; } return $value; } /** * Try to get a value deep down from a variable * e.g a[b][c] * * @param $original_key * @param $params * * @return mixed|string */ public static function get_deep_value( $original_key, $params ) { $original_key = str_replace( ']', '', $original_key ); $ref = $params; foreach ( explode( '[', $original_key ) as $key ) { if ( isset( $ref[ $key ] ) ) { $ref = $ref[ $key ]; } else { $ref = ''; } } return $ref; } /** * Shortcode render for data from $_REQUEST * * @param array $args * @param string $context * @param string $tag * * @return mixed|string */ public static function request_data_shortcode( $args = array(), $context = '', $tag = '' ) { $value = ''; $should_load_value = true; if ( ! empty( $tag ) && function_exists( 'is_editor_page' ) && is_editor_page() ) { //preserve shortcode in case someone adds it as dynamic link cuz why not if ( empty( $args['inline'] ) ) { $attributes = ''; foreach ( array( 'var_name', 'id', 'default', 'inline' ) as $key ) { if ( ! empty( $args[ $key ] ) ) { $attributes .= $key . '=' . $args[ $key ] . ' '; } } return '[' . $tag . ' ' . trim( $attributes ) . ']'; } $should_load_value = false; } if ( $should_load_value && ! empty( $args['var_name'] ) ) { /** * just in case the var_name has spaces check var_Name with underscore * e.g test 01 comes as test_01 */ $var_name = $args['var_name']; $fallback_var = strpos( $var_name, ' ' ) !== false ? preg_replace( "/\s/", "_", $var_name ) : ''; if ( strpos( $var_name, '((' ) !== false ) { $var_name = preg_replace( '#\\(\\(#', '[', $var_name ); $var_name = preg_replace( '#\\)\\)#', ']', $var_name ); } $global = []; switch ( $args['id'] ) { case 'post': $global = $_POST; break; case 'get': $global = $_GET; break; case 'cookie': $global = $_COOKIE; break; default: break; } $value = isset( $global[ $var_name ] ) ? $global[ $var_name ] : ''; if ( empty( $value ) ) { $value = static::get_deep_value( $var_name, $global ); } if ( empty( $value ) && ! empty( $fallback_var ) ) { $value = isset( $global[ $fallback_var ] ) ? $global[ $fallback_var ] : ''; } if ( empty( $value ) ) { $value = static::get_deep_value( $fallback_var, $global ); } $value = sanitize_text_field( $value ); } if ( empty( $value ) && isset( $args['default'] ) ) { $value = $args['default']; } return esc_html( stripslashes( $value ) ); } }