wp_count_terms( 'category' ) ) { $post_categories = []; $categories = get_terms( 'category', [ 'hide_empty' => false, ] ); foreach ( $categories as $category ) { $post_categories[ $category->term_id ] = $category->name; } $post_categories_field = 'select'; $post_categories_options = $post_categories; } // Post Tags. $post_tags_field = 'text'; $post_tags_options = ''; if ( 25 > wp_count_terms( 'post_tag' ) ) { $post_tags = []; $tags = get_terms( 'post_tag', [ 'hide_empty' => false, ] ); foreach ( $tags as $tag ) { $post_tags[ $tag->term_id ] = $tag->name; } $post_tags_field = 'select'; $post_tags_options = $post_tags; } $params = [ [ 'type' => 'fusion_logics', 'heading' => esc_html__( 'Rendering Logic', 'fusion-builder' ), 'param_name' => 'render_logics', 'description' => __( 'Add conditional rendering logic for the element. The element will only be part of the post / page contents, if the set conditions are met. NOTE: Server cache can interfere with results.', 'fusion-builder' ), 'group' => esc_attr__( 'Extras', 'fusion-builder' ), 'placeholder' => [ 'id' => 'placeholder', 'title' => esc_html__( 'Select A Condition Type', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], 'choices' => [ [ 'id' => 'device_type', 'title' => esc_html__( 'Device Type', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'desktop' => esc_html__( 'Desktop', 'fusion-builder' ), 'mobile_tablet' => __( 'Mobile & Tablet', 'fusion-builder' ), 'mobile' => __( 'Mobile', 'fusion-builder' ), 'tablet' => __( 'Tablet', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'get_var', 'title' => esc_html__( 'GET Variable', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'GET', 'fusion-builder' ), 'placeholder' => esc_html__( 'Variable Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'session_var', 'title' => esc_html__( 'SESSION Variable', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'SESSION', 'fusion-builder' ), 'placeholder' => esc_html__( 'Variable Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'user_agent', 'title' => esc_html__( 'User Agent', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'referrer', 'title' => esc_html__( 'Referrer', 'fusion-builder' ), 'placeholder' => esc_attr__( 'Referrer URL', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'user_role', 'title' => esc_html__( 'User Role', 'fusion-builder' ), 'type' => 'select', 'options' => self::get_user_roles(), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'user_state', 'title' => esc_html__( 'User State', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'logged_in' => esc_html__( 'Logged In', 'fusion-builder' ), 'logged_out' => esc_html__( 'Logged Out', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'custom_field', 'title' => esc_html__( 'Custom Field', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Field Name', 'fusion-builder' ), 'placeholder' => esc_html__( 'Field Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'published_date', 'title' => esc_html__( 'Post Published Date', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'format' => esc_html__( 'Published Date Format', 'fusion-builder' ), 'placeholder' => esc_html__( 'Y-m-d H:i:s', 'fusion-builder' ), ], 'placeholder' => esc_attr__( 'Accepts same inputs as strtotime()', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'modified_date', 'title' => esc_html__( 'Post Modified Date', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'format' => esc_html__( 'Modified Date Format', 'fusion-builder' ), 'placeholder' => esc_html__( 'Y-m-d H:i:s', 'fusion-builder' ), ], 'placeholder' => esc_attr__( 'Accepts same inputs as strtotime()', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'post_category', 'title' => esc_html__( 'Post Category', 'fusion-builder' ), 'type' => $post_categories_field, 'options' => $post_categories_options, 'placeholder' => esc_attr__( 'Category Name, Slug or ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'post_tag', 'title' => esc_html__( 'Post Tag', 'fusion-builder' ), 'type' => $post_tags_field, 'options' => $post_tags_options, 'placeholder' => esc_attr__( 'Tag Name, Slug or ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'post_term', 'title' => esc_html__( 'Post Term', 'fusion-builder' ), 'type' => 'text', 'placeholder' => esc_attr__( 'Term ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'post_count', 'title' => esc_html__( 'Post Count', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'term_count', 'title' => esc_html__( 'Term Count', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'is_term', 'title' => esc_html__( 'Term ID', 'fusion-builder' ), 'type' => 'text', 'placeholder' => esc_attr__( 'Term ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'featured_images_count', 'title' => esc_html__( 'Featured Images Count', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'comments_status', 'title' => esc_html__( 'Comments Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'open' => esc_html__( 'Open', 'fusion-builder' ), 'closed' => esc_html__( 'Closed', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'comments_count', 'title' => esc_html__( 'Comments Count', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'heading_number', 'title' => esc_html__( 'Number Of Headings', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], ], ], ]; $params = self::maybe_add_woo_options( $params ); $params = self::maybe_add_ec_options( $params ); $params = self::maybe_add_acf_options( $params ); // Add in custom params if they are set. $custom_conditions = FusionBuilder()->get_custom_conditions(); if ( ! empty( $custom_conditions ) ) { foreach ( $custom_conditions as $condition ) { if ( isset( $condition['param'] ) && is_array( $condition['param'] ) ) { $params[0]['choices'][] = $condition['param']; } } } // Override params. foreach ( $args as $key => $value ) { if ( 'fusion_remove_param' === $value && isset( $params[0][ $key ] ) ) { unset( $params[0][ $key ] ); continue; } $params[0][ $key ] = $value; } return $params; } /** * Returns all user roles. * * @since 3.3 * @return array states. */ public static function get_user_roles() { global $wp_roles; $roles = []; if ( is_array( $wp_roles->roles ) ) { foreach ( $wp_roles->roles as $key => $role ) { $roles[ $key ] = $role['name']; } } return $roles; } /** * Adds WooCommerce Options. * * @since 3.3 * @param array $params The existing params. * @return array. */ public static function maybe_add_woo_options( $params ) { if ( ! class_exists( 'WooCommerce' ) ) { return $params; } // Product categories. $product_categories_field = 'text'; $product_categories_options = ''; if ( 25 > wp_count_terms( 'product_cat' ) ) { $product_categories = []; $categories = get_terms( 'product_cat', [ 'hide_empty' => false, ] ); foreach ( $categories as $category ) { $product_categories[ $category->term_id ] = $category->name; } $product_categories_field = 'select'; $product_categories_options = $product_categories; } // Product tags. $product_tags_field = 'text'; $product_tags_options = ''; if ( 25 > wp_count_terms( 'product_tag' ) ) { $product_tags = []; $tags = get_terms( 'product_tag', [ 'hide_empty' => false, ] ); foreach ( $tags as $tag ) { $product_tags[ $tag->term_id ] = $tag->name; } $product_tags_field = 'select'; $product_tags_options = $product_tags; } // Order statuses. $statuses = wc_get_order_statuses(); $wc_statuses = []; foreach ( $statuses as $status_id => $status_name ) { $status_id = ( 'wc-' === substr( $status_id, 0, 3 ) ? substr( $status_id, 3 ) : $status_id ); $wc_statuses[ $status_id ] = $status_name; } $woo_options = [ [ 'id' => 'cart_status', 'title' => esc_html__( 'Cart Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'in' => esc_html__( 'In', 'fusion-builder' ), 'empty' => esc_html__( 'Empty', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'sale_status', 'title' => esc_html__( 'Sale Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'started' => esc_html__( 'Started', 'fusion-builder' ), 'ended' => esc_html__( 'Ended', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'stock_quantity', 'title' => esc_html__( 'Stock Quantity', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'stock_status', 'title' => esc_html__( 'Stock Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'in' => esc_html__( 'In Stock', 'fusion-builder' ), 'out' => esc_html__( 'Out of Stock', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'purchased_product', 'title' => esc_html__( 'Product Purchase Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'purchased' => esc_html__( 'Purchased', 'fusion-builder' ), 'not_purchased' => esc_html__( 'Not Purchased', 'fusion-builder' ), ], 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Product ID', 'fusion-builder' ), 'placeholder' => esc_html__( 'ID or empty for current prodcut', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'product_type', 'title' => esc_html__( 'Product Type', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'simple' => esc_html__( 'Simple Product', 'fusion-builder' ), 'grouped' => esc_html__( 'Grouped Product', 'fusion-builder' ), 'external' => esc_html__( 'External/Affiliate Product', 'fusion-builder' ), 'variable' => esc_html__( 'Variable Product', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'product_category', 'title' => esc_html__( 'Product Category', 'fusion-builder' ), 'type' => $product_categories_field, 'options' => $product_categories_options, 'placeholder' => esc_html__( 'Category Name, Slug or ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'product_tag', 'title' => esc_html__( 'Product Tag', 'fusion-builder' ), 'type' => $product_tags_field, 'options' => $product_tags_options, 'placeholder' => esc_html__( 'Tag Name, Slug or ID', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'related_products_count', 'title' => esc_html__( 'Related Products', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'up_sells_products_count', 'title' => esc_html__( 'Up-Sells Products', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'cross_sells_products_count', 'title' => esc_html__( 'Cross-Sells Products', 'fusion-builder' ), 'type' => 'text', 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'product_variations', 'title' => esc_html__( 'Product Variations', 'fusion-builder' ), 'type' => 'text', 'placeholder' => esc_html__( 'Attribute Name eg. color or size.', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Has', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Has Not', 'fusion-builder' ), ], ], [ 'id' => 'order_received_status', 'title' => esc_html__( 'Order Received Status', 'fusion-builder' ), 'type' => 'select', 'placeholder' => esc_html__( 'If the order received page (after user checks out), is successful (payment successful) or not (payment denied by bank for example).', 'fusion-builder' ), 'options' => $wc_statuses, 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], [ 'id' => 'order_received_total_value', 'title' => esc_html__( 'Order Received Total Value', 'fusion-builder' ), 'type' => 'text', 'placeholder' => esc_html__( 'The total value of the order. Works only on order received page (after user checks out).', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'order_received_downloads', 'title' => esc_html__( 'Order Received Download Count', 'fusion-builder' ), 'type' => 'text', 'placeholder' => esc_html__( 'How many items can be downloaded on the order received page (after user checks out).', 'fusion-builder' ), 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], ]; $params[0]['choices'] = array_merge( $params[0]['choices'], $woo_options ); return $params; } /** * Adds Event Calendar Options. * * @since 3.3 * @param array $params The existing params. * @return array. */ public static function maybe_add_ec_options( $params ) { if ( ! class_exists( 'Tribe__Events__Main' ) ) { return $params; } $ec_options = [ [ 'id' => 'event_status', 'title' => esc_html__( 'Event Status', 'fusion-builder' ), 'type' => 'select', 'options' => [ 'started' => esc_html__( 'Started', 'fusion-builder' ), 'ended' => esc_html__( 'Ended', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), ], ], ]; $params[0]['choices'] = array_merge( $params[0]['choices'], $ec_options ); return $params; } /** * Adds ACF Options. * * @since 3.5 * @param array $params The existing params. * @return array. */ public static function maybe_add_acf_options( $params ) { if ( ! class_exists( 'ACF' ) ) { return $params; } $options = [ [ 'id' => 'acf_field', 'title' => esc_html__( 'ACF Field', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Field Name', 'fusion-builder' ), 'placeholder' => esc_html__( 'Field Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'acf_repeater_count', 'title' => esc_html__( 'ACF Repeater Count', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Field Name', 'fusion-builder' ), 'placeholder' => esc_html__( 'Field Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], [ 'id' => 'acf_repeater_single_value', 'title' => esc_html__( 'ACF Repeater Single Value', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Field', 'fusion-builder' ), 'placeholder' => 'field[1][name]', ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'acf_repeater_sub_field', 'title' => esc_html__( 'ACF Repeater Sub Field', 'fusion-builder' ), 'description' => esc_html__( 'Enter repeater sub field name. This option only works on post cards within the ACF repeater loop.', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Sub Field name', 'fusion-builder' ), 'placeholder' => esc_html__( 'Sub Field name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), 'contains' => esc_attr__( 'Contains', 'fusion-builder' ), ], ], [ 'id' => 'acf_relationship_count', 'title' => esc_html__( 'ACF Relationship Count', 'fusion-builder' ), 'type' => 'text', 'additionals' => [ 'type' => 'text', 'title' => esc_html__( 'Field Name', 'fusion-builder' ), 'placeholder' => esc_html__( 'Field Name', 'fusion-builder' ), ], 'comparisons' => [ 'equal' => esc_attr__( 'Equal To', 'fusion-builder' ), 'not-equal' => esc_attr__( 'Not Equal To', 'fusion-builder' ), 'greater-than' => esc_attr__( 'Greater Than', 'fusion-builder' ), 'less-than' => esc_attr__( 'Less Than', 'fusion-builder' ), ], ], ]; $params[0]['choices'] = array_merge( $params[0]['choices'], $options ); return $params; } /** * Checks if element should render or not. * * @since 3.3 * @param array $atts The attributes. * @return bool */ public static function should_render( $atts ) { $logics = ( isset( $atts['render_logics'] ) && '' !== $atts['render_logics'] ) ? json_decode( base64_decode( $atts['render_logics'] ) ) : []; $checks = []; if ( empty( $logics ) ) { return true; } foreach ( $logics as $logic ) { $check = []; $operator = isset( $logic->operator ) ? $logic->operator : ''; $comparison = isset( $logic->comparison ) ? $logic->comparison : ''; $field_name = isset( $logic->field ) && ! is_null( $logic->field ) ? $logic->field : ''; $desired_value = isset( $logic->value ) ? $logic->value : ''; $additionals = isset( $logic->additionals ) ? $logic->additionals : ''; $current_value = self::get_value( $field_name, $desired_value, $additionals ); if ( ! $field_name || ! $comparison ) { continue; } array_push( $check, $operator ); array_push( $check, '' !== $current_value ? self::is_match( $current_value, $desired_value, $comparison, $field_name ) : false ); array_push( $checks, $check ); fusion_library()->conditional_loading[] = [ 'operator' => $operator, 'comparison' => $comparison, 'field_name' => $field_name, 'desired_value' => $desired_value, 'additionals' => $additionals, 'current_value' => $current_value, ]; } if ( count( $checks ) ) { return self::match_conditions( $checks ); } return true; } /** * Gets value. * * @since 3.3 * @param string $name The item name. * @param string $value The desired name. * @param string $additionals The additional data. * @return mixed. */ public static function get_value( $name, $value, $additionals ) { $woo_options = [ 'cart_status', 'sale_status', 'stock_quantity' ]; $event_options = [ 'event_status' ]; $acf_options = [ 'acf_field' ]; $custom_conditions = FusionBuilder()->get_custom_conditions(); if ( isset( $custom_conditions[ $name ]['callback'] ) ) { return call_user_func_array( $custom_conditions[ $name ]['callback'], [ $value, $additionals ] ); } if ( in_array( $name, $woo_options, true ) && ! class_exists( 'WooCommerce' ) || in_array( $name, $event_options, true ) && ! class_exists( 'Tribe__Events__Main' ) || in_array( $name, $acf_options, true ) && ! class_exists( 'ACF' ) ) { return ''; } switch ( $name ) { case 'user_state': return is_user_logged_in() ? 'logged_in' : 'logged_out'; case 'cart_status': if ( 'in' === $value ) { $is_in_cart = false; $product_id = get_the_ID(); $parent_id = wp_get_post_parent_id( $product_id ); $product_id = $parent_id > 0 ? $parent_id : $product_id; if ( is_object( WC()->cart ) ) { foreach ( WC()->cart->get_cart() as $cart_item ) { if ( $cart_item['product_id'] === $product_id ) { $is_in_cart = true; } } } return $is_in_cart ? 'in' : null; } else { return is_object( WC()->cart ) && 0 === WC()->cart->get_cart_contents_count() ? 'empty' : null; } case 'sale_status': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return ''; } if ( 'started' === $value ) { return $product->is_on_sale() ? 'started' : null; } else { return ! $product->is_on_sale() ? 'ended' : null; } case 'stock_quantity': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } return $product->get_stock_quantity(); case 'stock_status': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } return $product->is_in_stock() ? 'in' : 'out'; case 'purchased_product': $product = isset( $additionals ) && ! empty( $additionals ) ? wc_get_product( $additionals ) : wc_get_product( get_the_ID() ); if ( false === $product || ! is_user_logged_in() ) { return 0; } return wc_customer_bought_product( '', get_current_user_id(), $product->get_id() ) ? 'purchased' : 'not_purchased'; case 'product_type': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } return $product->get_type(); case 'product_category': return has_term( $value, 'product_cat' ) ? $value : null; case 'product_tag': return has_term( $value, 'product_tag' ) ? $value : null; case 'related_products_count': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } $related_products = wc_get_related_products( get_the_ID(), intval( $value ) + 1 ); return count( $related_products ); case 'up_sells_products_count': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } return count( $product->get_upsell_ids() ); case 'cross_sells_products_count': if ( is_cart() && is_object( WC()->cart ) ) { return count( WC()->cart->get_cross_sells() ); } $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } return count( $product->get_cross_sell_ids() ); case 'product_variations': $product = wc_get_product( get_the_ID() ); if ( false === $product ) { return 0; } if ( ! $product->is_type( 'variable' ) ) { return 0; } $atts = $product->get_variation_attributes(); return ! empty( $product->get_attributes() ) && is_array( $atts ) && array_key_exists( 'pa_' . strtolower( $value ), $atts ) ? $value : null; case 'published_date': $format = ! empty( $additionals ) ? $additionals : 'U'; return get_the_time( $format ); case 'modified_date': $format = ! empty( $additionals ) ? $additionals : 'U'; return get_the_modified_date( $format ); case 'post_category': return has_term( $value, 'category' ) ? $value : null; case 'post_tag': return has_term( $value, 'post_tag' ) ? $value : null; case 'post_count': $count = is_archive() || is_search() ? get_queried_object()->count : null; return $count; case 'term_count': if ( is_archive() || is_tax() ) { return count( get_terms( [ 'taxonomy' => get_queried_object()->taxonomy, 'child_of' => get_queried_object()->term_id, ] ) ); } else { return null; } case 'is_term': $queried_object = get_queried_object(); if ( ( is_archive() || is_tax() ) && isset( $queried_object->term_id ) ) { return $queried_object->term_id; } else { return 0; } case 'featured_images_count': return function_exists( 'avada_number_of_featured_images' ) ? avada_number_of_featured_images( true ) : 0; case 'comments_status': return comments_open() ? 'open' : 'closed'; case 'comments_count': return intval( get_comments_number() ); case 'event_status': $id = get_the_ID(); if ( ! tribe_is_event( $id ) ) { return ''; } $event = tribe_events_get_event( $id ); $end_date = tribe_get_end_date( $event, true, 'U' ); $start_date = tribe_get_start_date( $event, true, 'U' ); if ( 'started' === $value ) { return time() < $end_date ? 'started' : null; } else { return time() > $end_date ? 'ended' : null; } case 'device_type': if ( fusion_library()->device_detection->is_mobile() && 'mobile_tablet' !== $value ) { return 'mobile'; } elseif ( fusion_library()->device_detection->is_tablet() && 'mobile_tablet' !== $value ) { return 'tablet'; } elseif ( ! wp_is_mobile() ) { return 'desktop'; } elseif ( wp_is_mobile() ) { return 'mobile_tablet'; } return ''; case 'user_agent': return isset( $_SERVER['HTTP_USER_AGENT'] ) ? wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) : null; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized case 'referrer': return wp_get_referer(); case 'user_role': $user = wp_get_current_user(); return 0 !== $user->ID ? $user->roles : []; case 'get_var': if ( ! isset( $_GET[ $additionals ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification return null; } if ( is_array( $_GET[ $additionals ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification return array_map( 'sanitize_text_field', $_GET[ $additionals ] ); // phpcs:ignore WordPress.Security } return sanitize_text_field( wp_unslash( $_GET[ $additionals ] ) ); // phpcs:ignore WordPress.Security.NonceVerification case 'session_var': if ( ! isset( $_SESSION[ $additionals ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification return null; } if ( is_array( $_SESSION[ $additionals ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification return array_map( 'sanitize_text_field', $_SESSION[ $additionals ] ); // phpcs:ignore WordPress.Security } return sanitize_text_field( wp_unslash( $_SESSION[ $additionals ] ) ); // phpcs:ignore WordPress.Security.NonceVerification case 'custom_field': $post_meta = get_post_meta( get_the_ID(), $additionals, true ); return ! empty( $post_meta ) ? $post_meta : null; case 'acf_field': $acf_field = ! is_archive() ? get_field( $additionals ) : get_field( $additionals, get_queried_object() ); $field_object = get_field_object( $additionals ); if ( isset( $field_object['type'] ) && 'true_false' === $field_object['type'] ) { if ( true === $acf_field ) { $acf_field = 'true'; } else if ( false === $acf_field ) { $acf_field = 'false'; } } else if ( empty( $acf_field ) ) { $acf_field = null; } return $acf_field; case 'acf_repeater_count': $count = 0; if ( class_exists( 'ACF' ) && $additionals && have_rows( $additionals ) ) { $count = count( get_field( $additionals ) ); } return $count; case 'acf_repeater_single_value': if ( ! $additionals ) { return ''; } preg_match( '/.+?(?=\[)/', $additionals, $field ); $field = $field[0]; preg_match_all( '/\[(.*?)\]/', $additionals, $keys ); $keys = $keys[1]; $index = isset( $keys[0] ) ? $keys[0] : ''; $key = isset( $keys[1] ) ? $keys[1] : ''; $value = Fusion_Dynamic_Data_Callbacks::acf_get_repeater_single_field( [ 'field' => $field, 'index' => $index, 'key' => $key, ] ); return $value; case 'acf_repeater_sub_field': if ( ! $additionals ) { return ''; } $value = Fusion_Dynamic_Data_Callbacks::acf_get_repeater_sub_field( [ 'sub_field' => $additionals ] ); return $value; case 'acf_relationship_count': $count = 0; if ( class_exists( 'ACF' ) && $additionals && have_rows( $additionals ) ) { $count = count( get_field( $additionals, false, false ) ); } return $count; case 'heading_number': return awb_get_approx_nr_of_headings( (int) get_the_ID() ); case 'order_received_status': global $wp; if ( is_object( $wp ) && property_exists( $wp, 'query_vars' ) && isset( $wp->query_vars['order-received'] ) ) { $wc_order = wc_get_order( apply_filters( 'woocommerce_thankyou_order_id', absint( $wp->query_vars['order-received'] ) ) ); } else { return ''; } return $wc_order->get_status(); case 'order_received_total_value': global $wp; if ( is_object( $wp ) && property_exists( $wp, 'query_vars' ) && isset( $wp->query_vars['order-received'] ) ) { $wc_order = wc_get_order( apply_filters( 'woocommerce_thankyou_order_id', absint( $wp->query_vars['order-received'] ) ) ); } else { return false; } return $wc_order->get_total(); case 'order_received_downloads': global $wp; if ( is_object( $wp ) && property_exists( $wp, 'query_vars' ) && isset( $wp->query_vars['order-received'] ) ) { $wc_order = wc_get_order( apply_filters( 'woocommerce_thankyou_order_id', absint( $wp->query_vars['order-received'] ) ) ); } else { return false; } if ( $wc_order->has_downloadable_item() && $wc_order->is_download_permitted() ) { return count( $wc_order->get_downloadable_items() ); } return false; case 'post_term': global $post; $taxonomy_ids = []; if ( ! $post ) { return $taxonomy_ids; } $post_taxonomies = get_object_taxonomies( $post, 'objects' ); if ( ! is_array( $post_taxonomies ) ) { return $taxonomy_ids; } foreach ( $post_taxonomies as $taxonomy ) { $terms = get_the_terms( $post, $taxonomy->name ); if ( ! is_array( $terms ) ) { continue; } foreach ( $terms as $term ) { array_push( $taxonomy_ids, $term->term_id ); } } return $taxonomy_ids; } } /** * Matches current and desired values. * * @since 3.3 * @param mixed $current_value The current value. * @param string $desired_value The desired value. * @param string $comparison The desired comparison. * @param string $field_name The field name. * @return bool */ public static function is_match( $current_value, $desired_value, $comparison, $field_name ) { $current_value = self::format_string( $current_value, $field_name ); $desired_value = self::format_string( $desired_value, $field_name ); switch ( $comparison ) { case 'equal': return is_array( $current_value ) ? in_array( $desired_value, $current_value ) : $current_value === $desired_value; // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict case 'not-equal': return is_array( $current_value ) ? ! in_array( $desired_value, $current_value ) : $current_value !== $desired_value; // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict case 'greater-than': return floatval( $current_value ) > floatval( $desired_value ); case 'less-than': return floatval( $current_value ) < floatval( $desired_value ); case 'contains': return false !== strpos( $current_value, $desired_value ); } return false; } /** * Format variables to be lowercase strings. * * @static * @since 3.11.3 * @access public * @param mixed $value The current value. * @param string $field_name The field name. * @return mixed The formatted value. */ public static function format_string( $value, $field_name = '' ) { if ( 'published_date' === $field_name || 'modified_date' === $field_name ) { $value = strtotime( $value ); } else if ( is_array( $value ) ) { $value = array_map( [ 'Fusion_Builder_Conditional_Render_Helper', 'format_string' ], $value ); } elseif ( is_null( $value ) || is_bool( $value ) || is_numeric( $value ) || is_string( $value ) ) { $value = strtolower( (string) $value ); } return $value; } /** * Matches conditions. * * @since 3.3 * @param array $checks An array of all the conditions. * @return bool. */ public static function match_conditions( $checks ) { $is_match = null; $encoded = wp_json_encode( $checks ); // If all conditions are of OR type. if ( false === strpos( $encoded, 'and' ) ) { foreach ( $checks as $check ) { $is_match = null === $is_match ? $check[1] : $is_match; $is_match = $is_match || $check[1]; } return $is_match; } // If all conditions are of AND type. if ( false === strpos( $encoded, 'or' ) ) { foreach ( $checks as $check ) { $is_match = null === $is_match ? $check[1] : $is_match; $is_match = $is_match && $check[1]; } return $is_match; } return self::match_mixed_conditions( $checks ); } /** * Matches mixed conditions. * * @since 3.3 * @param array $checks An array of all the conditions. * @return bool. */ public static function match_mixed_conditions( $checks ) { $collected_conditions = []; $current_operation = ''; $size = count( $checks ); $j = 0; $k = 0; // Combine conditions based on comparison operator change. for ( $i = 0; $i < $size; $i++ ) { if ( '' === $current_operation || $current_operation === $checks[ $i ][0] ) { $collected_conditions[ $j ][ $k ] = $checks[ $i ][1]; $k++; $collected_conditions[ $j ][ $k ] = $checks[ $i ][0]; $k++; $current_operation = $checks[ $i ][0]; } else { $collected_conditions[ $j ][ $k ] = $checks[ $i ][1]; $k++; $collected_conditions[ $j ][ $k ] = $checks[ $i ][0]; $j++; $k = 0; $current_operation = ''; } } // Process conditions. $final_conditions = []; $main_operator = ''; $temp_result = ''; $inner_operator = ''; $operand_first = ''; $operand_second = ''; foreach ( $collected_conditions as $condition ) { $size = count( $condition ); if ( $size < 3 ) { $final_conditions[] = $condition[0]; $final_conditions[] = $condition[1]; continue; } for ( $i = 0; $i < $size - 1; $i++ ) { if ( '' === $temp_result ) { $operand_first = $condition[ $i ]; $operand_second = $condition[ $i + 2 ]; $inner_operator = $condition[ $i + 1 ]; $i = $i + 2; $temp_result = 'or' === $inner_operator ? ( $operand_first || $operand_second ) : ( $operand_first && $operand_second ); } else { $operand_first = $temp_result; $operand_second = $condition[ $i + 1 ]; $inner_operator = $condition[ $i ]; $temp_result = 'or' === $inner_operator ? ( $operand_first || $operand_second ) : ( $operand_first && $operand_second ); $i++; } if ( true !== $temp_result ) { $temp_result = false; } } $main_operator = $condition; $final_conditions[] = $temp_result; $final_conditions[] = $main_operator[ $size - 1 ]; $temp_result = ''; } // Final comparisons. $temp_result = ''; $inner_operator = ''; $operand_first = ''; $operand_second = ''; $size = count( $final_conditions ); if ( 3 > $size ) { return $final_conditions[0]; } for ( $i = 0; $i < $size - 1; $i++ ) { if ( '' === $temp_result ) { $operand_first = $final_conditions[ $i ]; $operand_second = $final_conditions[ $i + 2 ]; $inner_operator = $final_conditions[ $i + 1 ]; $i = $i + 2; $temp_result = 'or' === $inner_operator ? ( $operand_first || $operand_second ) : ( $operand_first && $operand_second ); } else { $operand_first = $temp_result; $operand_second = $final_conditions[ $i + 1 ]; $inner_operator = $final_conditions[ $i ]; $temp_result = 'or' === $inner_operator ? ( $operand_first || $operand_second ) : ( $operand_first && $operand_second ); $i++; } if ( true !== $temp_result ) { $temp_result = false; } } return $temp_result; } }