get_all_conditions(); list( , $url ) = RWMB_Loader::get_path( dirname( dirname( __FILE__ ) ) ); if ( ! is_admin() && ! defined( 'MB_FRONTEND_SUBMISSION_DIR' ) ) { return; } // Backward compatibility. $url = defined( 'MBC_JS_URL' ) ? MBC_JS_URL : $url . 'js/'; wp_register_script( 'conditional-logic', $url . 'conditional-logic.js', array(), '1.5', true ); wp_localize_script( 'conditional-logic', 'conditions', $conditions ); wp_enqueue_script( 'conditional-logic' ); } /** * Insert field condition. * * @param string $begin The beginning HTML output of the field. * @param array $field Field settings. * @param mixed $meta Field meta value. * * @return string */ public function insert_field_conditions( $begin, $field, $meta ) { if ( empty( $field['visible'] ) && empty( $field['hidden'] ) ) { return $begin; } $conditions = array( 'visible', 'hidden' ); foreach ( $conditions as $index => $visibility ) { unset( $conditions[ $index ] ); if ( isset( $field[ $visibility ] ) ) { $conditions[ $visibility ] = $this->parse_condition( $field[ $visibility ] ); } } $begin .= ''; return $begin; } /** * Get all attached conditional logic on fields or meta boxes * * @return Mixed All attached conditional logic */ public function get_all_conditions() { $outside_conditions = apply_filters( 'rwmb_outside_conditions', array() ); $conditions = array(); foreach ( $outside_conditions as $field_id => $field_conditions ) { if ( empty( $field_id ) ) { continue; } if ( ! empty( $field_conditions['visible'] ) ) { $conditions[ $field_id ]['visible'] = $this->parse_condition( $field_conditions['visible'] ); } if ( ! empty( $field_conditions['hidden'] ) ) { $conditions[ $field_id ]['hidden'] = $this->parse_condition( $field_conditions['hidden'] ); } } return $conditions; } /** * Parse various style of a collection to JS readable * * @param Mixed $condition Condition. * * @return array */ public function parse_condition( $condition ) { if ( ! is_array( $condition ) ) { return array( 'when' => array(), 'relation' => 'and', ); } $relation = ( isset( $condition['relation'] ) && in_array( $condition['relation'], array( 'and', 'or' ) ) ) ? $condition['relation'] : 'and'; $condition_to_normalize = $condition; if ( isset( $condition['when'] ) && is_array( $condition['when'] ) ) { $condition_to_normalize = $condition['when']; } $when = $this->get_normalized_criteria( $condition_to_normalize ); return compact( 'when', 'relation' ); } /** * Normalize all condition criteria. * * @param array $condition List of condition criteria. * * @return array */ private function get_normalized_criteria( $condition ) { $normalized = array(); foreach ( $condition as $criteria ) { if ( is_array( $criteria ) ) { $normalized[] = $this->normalize_criteria( $criteria ); } else { $normalized[] = $this->normalize_criteria( $condition ); break; } } return $normalized; } /** * Insert data-conditions="{JSON}" to Meta Boxes or Fields. * * @param RW_Meta_Box $obj The meta box object. * * @since 1.2 */ public function insert_meta_box_conditions( $obj ) { $toggle_type = 'display'; if ( ! empty( $obj->meta_box['toggle_type'] ) && in_array( $toggle_type, array( 'display', 'visibility' ) ) ) { $toggle_type = $obj->meta_box['toggle_type']; } echo ''; if ( empty( $obj->meta_box ) || ( empty( $obj->meta_box['visible'] ) && empty( $obj->meta_box['hidden'] ) ) ) { return; } $conditions = array( 'visible', 'hidden' ); foreach ( $conditions as $index => $visibility ) { unset( $conditions[ $index ] ); if ( isset( $obj->meta_box[ $visibility ] ) ) { $conditions[ $visibility ] = $this->parse_condition( $obj->meta_box[ $visibility ] ); } } echo ''; } /** * If criteria has different format than normally, reformat it * * @param array $criteria Criteria to be formatted. * * @return array Criteria after formatted. */ public function normalize_criteria( $criteria ) { $criteria_length = count( $criteria ); if ( 2 === $criteria_length ) { $criteria = array( $criteria[0], '=', $criteria[1] ); } // Convert slug to id if conditional logic defined using slug for terms. if ( strrpos( $criteria[0], 'slug:', - strlen( $criteria[0] ) ) !== false ) { $criteria[0] = ltrim( $criteria[0], 'slug:' ); $criteria[2] = $this->slug_to_id( $criteria[2] ); } return $criteria; } /** * Convert slug to id. * * @param array $slugs Array of slugs. * * @return array Array of ids. */ private function slug_to_id( $slugs ) { global $wpdb; $slugs = (array) $slugs; $sql = "SELECT term_id FROM {$wpdb->terms} WHERE slug IN(" . implode( ', ', array_fill( 0, count( $slugs ), '%s' ) ) . ')'; $prepared = call_user_func_array( array( $wpdb, 'prepare' ), array_merge( array( $sql ), $slugs ) ); return array_map( 'intval', $wpdb->get_col( $prepared ) ); } }