'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 ) );
}
}