You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
3.9 KiB
PHP

<?php
/**
* Custom Field's logic swiftly crafted.
*
* @since 4.11.0
*
* @package Divi
* @sub-package Builder
*/
namespace Module\Field\DisplayConditions;
/**
* Custom Field Condition Trait
*/
trait CustomFieldCondition {
/**
* Evaluates "Custom Field" condition.
*
* @since 4.14.3
*
* @param array $condition_settings The Condition settings containing:
* 'selectConditionalMetaField' => base64_data.
*
* @return boolean Returns `true` if the condition evaluation is true, `false` otherwise.
*/
protected function _process_custom_field_condition( $condition_settings ) {
// Only check for Posts.
if ( ! is_singular() ) {
return false;
}
// Only check if queried object id is valid.
$queried_object_id = get_queried_object_id();
if ( ! \WP_Post::get_instance( $queried_object_id ) ) {
return false;
}
// Decodes the base64 data and runs validations.
$meta_field_settings_base64 = isset( $condition_settings['selectConditionalMetaField'] ) ? $condition_settings['selectConditionalMetaField'] : '';
$meta_field_settings_json = base64_decode( $meta_field_settings_base64 ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_decode -- The returned data is an array and necessary validation checks are performed.
$meta_field_settings = false !== $meta_field_settings_json ? json_decode( $meta_field_settings_json, true ) : [];
// Gets meta fields settings.
$display_rule = isset( $meta_field_settings['displayRule'] ) ? $meta_field_settings['displayRule'] : 'is';
$selected_field_name = isset( $meta_field_settings['selectedFieldName'] ) ? $meta_field_settings['selectedFieldName'] : 'manualCustomFieldName';
$custom_field_name = isset( $meta_field_settings['customFieldName'] ) ? $meta_field_settings['customFieldName'] : '';
$selected_field_value = isset( $meta_field_settings['selectedFieldValue'] ) ? $meta_field_settings['selectedFieldValue'] : 'manualCustomFieldValue';
$custom_field_value = isset( $meta_field_settings['customFieldValue'] ) ? $meta_field_settings['customFieldValue'] : '';
$field_name = 'manualCustomFieldName' === $selected_field_name ? $custom_field_name : $selected_field_name;
$has_custom_field_value = 'manualCustomFieldValue' === $selected_field_value ? true : false;
// Checks whether the specified custom fields actually exist.
$has_field_name_metadata = metadata_exists( 'post', $queried_object_id, $field_name );
$has_selected_field_value_metadata = $has_custom_field_value ? true : metadata_exists( 'post', $queried_object_id, $selected_field_value );
// Bailout if specified custom fields don't exist.
if ( ! $has_field_name_metadata || ! $has_selected_field_value_metadata ) {
return false;
}
$field_name_meta = (string) get_post_meta( $queried_object_id, $field_name, true );
$field_value_meta = $has_custom_field_value ? (string) $custom_field_value : (string) get_post_meta( $queried_object_id, $selected_field_value, true );
// The PHP 7.4 and below will throw warning if we pass empty string on the 2nd arg
// of `strpos`. We have to avoid this issue and make sure the `Contains` condition
// threat $field_value_meta empty value as invalid condition (no match).
$contains = false;
if ( ! empty( $field_value_meta ) ) {
$contains = strpos( $field_name_meta, $field_value_meta );
}
$output = [
'is' => $field_name_meta === $field_value_meta,
'isNot' => $field_name_meta !== $field_value_meta,
'contains' => false !== $contains,
'doesNotContain' => false === $contains,
'isAnyValue' => strlen( $field_name_meta ) > 0,
'hasNoValue' => strlen( $field_name_meta ) === 0,
'isGreaterThan' => (float) $field_name_meta > (float) $field_value_meta,
'isLessThan' => (float) $field_name_meta < (float) $field_value_meta,
];
return isset( $output[ $display_rule ] ) ? $output[ $display_rule ] : false;
}
}