meta_box = $meta_box; add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) ); add_action( 'save_post', array( $this, 'save_meta_box' ), 1, 2 ); } /** * Adds meta box to any post type * * @uses add_meta_box() * * @access public * @since 1.0 */ public function add_meta_boxes() { global $wp_version; $is_wp_5 = version_compare( $wp_version, '5.0', '>=' ); foreach ( (array) $this->meta_box['pages'] as $page ) { add_meta_box( $this->meta_box['id'], $this->meta_box['title'], array( $this, 'build_meta_box' ), $page, $this->meta_box['context'], $this->meta_box['priority'], $this->meta_box['fields'] ); if ( $is_wp_5 ) { add_filter( 'postbox_classes_' . $page . '_' . $this->meta_box['id'], function( $classes ) { array_push( $classes, 'ot-meta-box' ); return $classes; } ); } } } /** * Meta box view. * * @access public * @since 1.0 * * @param object $post The WP_Post object. * @param array $fields The meta box fields. */ public function build_meta_box( $post, $fields ) { unset( $fields ); // @todo Check if the loop can use this param. echo '
'; // Use nonce for verification. echo ''; // Meta box description. echo isset( $this->meta_box['desc'] ) && ! empty( $this->meta_box['desc'] ) ? '
' . htmlspecialchars_decode( $this->meta_box['desc'] ) . '
' : ''; // phpcs:ignore // Loop through meta box fields. foreach ( $this->meta_box['fields'] as $field ) { // Get current post meta data. $field_value = get_post_meta( $post->ID, $field['id'], true ); // Set standard value. if ( isset( $field['std'] ) ) { $field_value = ot_filter_std_value( $field_value, $field['std'] ); } // Build the arguments array. $_args = array( 'type' => $field['type'], 'field_id' => $field['id'], 'field_name' => $field['id'], 'field_value' => $field_value, 'field_desc' => isset( $field['desc'] ) ? $field['desc'] : '', 'field_std' => isset( $field['std'] ) ? $field['std'] : '', 'field_rows' => isset( $field['rows'] ) && ! empty( $field['rows'] ) ? $field['rows'] : 10, 'field_post_type' => isset( $field['post_type'] ) && ! empty( $field['post_type'] ) ? $field['post_type'] : 'post', 'field_taxonomy' => isset( $field['taxonomy'] ) && ! empty( $field['taxonomy'] ) ? $field['taxonomy'] : 'category', 'field_min_max_step' => isset( $field['min_max_step'] ) && ! empty( $field['min_max_step'] ) ? $field['min_max_step'] : '0,100,1', 'field_class' => isset( $field['class'] ) ? $field['class'] : '', 'field_condition' => isset( $field['condition'] ) ? $field['condition'] : '', 'field_operator' => isset( $field['operator'] ) ? $field['operator'] : 'and', 'field_choices' => isset( $field['choices'] ) ? $field['choices'] : array(), 'field_settings' => isset( $field['settings'] ) && ! empty( $field['settings'] ) ? $field['settings'] : array(), 'post_id' => $post->ID, 'meta' => true, ); $conditions = ''; // Setup the conditions. if ( isset( $field['condition'] ) && ! empty( $field['condition'] ) ) { $conditions = ' data-condition="' . esc_attr( $field['condition'] ) . '"'; $conditions .= isset( $field['operator'] ) && in_array( $field['operator'], array( 'and', 'AND', 'or', 'OR' ), true ) ? ' data-operator="' . esc_attr( $field['operator'] ) . '"' : ''; } // Only allow simple textarea due to DOM issues with wp_editor(). if ( false === apply_filters( 'ot_override_forced_textarea_simple', false, $field['id'] ) && 'textarea' === $_args['type'] ) { $_args['type'] = 'textarea-simple'; } // Build the setting CSS class. if ( ! empty( $_args['field_class'] ) ) { $classes = explode( ' ', $_args['field_class'] ); foreach ( $classes as $key => $value ) { $classes[ $key ] = $value . '-wrap'; } $class = 'format-settings ' . implode( ' ', $classes ); } else { $class = 'format-settings'; } // Option label. echo '
'; // phpcs:ignore echo '
'; // Don't show title with textblocks. if ( 'textblock' !== $_args['type'] && ! empty( $field['label'] ) ) { echo '
'; // @hu_custom: allow html in the label field echo ''; echo '
'; } // Get the option HTML. echo ot_display_by_type( $_args ); // phpcs:ignore echo '
'; echo '
'; } echo '
'; echo '
'; } /** * Saves the meta box values * * @access public * @since 1.0 * * @param int $post_id The post ID. * @param object $post_object The WP_Post object. * @return int|void */ public function save_meta_box( $post_id, $post_object ) { global $pagenow; // Verify nonce. if ( !isset( $_POST[ $this->meta_box['id'] . '_nonce' ] ) || !wp_verify_nonce( $_POST[ $this->meta_box['id'] . '_nonce' ], $this->meta_box['id'] ) ) { // phpcs:ignore return $post_id; } // Store the post global for use later. $post_global = $_POST; // Don't save if $_POST is empty. if ( empty( $post_global ) || ( isset( $post_global['vc_inline'] ) && true === $post_global['vc_inline'] ) ) { return $post_id; } // Don't save during quick edit. if ( 'admin-ajax.php' === $pagenow ) { return $post_id; } // Don't save during autosave. if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return $post_id; } // Don't save if viewing a revision. if ( 'revision' === $post_object->post_type || 'revision.php' === $pagenow ) { return $post_id; } // Check permissions. if ( isset( $post_global['post_type'] ) && 'page' === $post_global['post_type'] ) { if ( ! current_user_can( 'edit_page', $post_id ) ) { return $post_id; } } else { if ( ! current_user_can( 'edit_post', $post_id ) ) { return $post_id; } } foreach ( $this->meta_box['fields'] as $field ) { $old = get_post_meta( $post_id, $field['id'], true ); $new = ''; // There is data to validate. if ( isset( $post_global[ $field['id'] ] ) ) { // Run through validation. $new = ot_validate_setting( $post_global[ $field['id'] ], $field['type'], $field['id'] ); // Insert CSS. if ( 'css' === $field['type'] ) { if ( '' !== $new ) { // insert CSS into dynamic.css. ot_insert_css_with_markers( $field['id'], $new, true ); } else { // Remove old CSS from dynamic.css. ot_remove_old_css( $field['id'] ); } } } if ( isset( $new ) && $new !== $old ) { update_post_meta( $post_id, $field['id'], $new ); } elseif ( '' === $new && $old ) { delete_post_meta( $post_id, $field['id'], $old ); } } } } } if ( ! function_exists( 'ot_register_meta_box' ) ) { /** * This method instantiates the meta box class & builds the UI. * * @uses OT_Meta_Box() * * @param array $args Meta box arguments. * * @access public * @since 2.0 */ function ot_register_meta_box( $args ) { if ( ! $args ) { return; } new OT_Meta_Box( $args ); } }