Linux hkvL61zh9Vexzf 3.10.0-957.1.3.el7.x86_64 #1 SMP Thu Nov 29 14:49:43 UTC 2018 x86_64 Path : /www/wwwroot/fashion-kingdom.com/wp-content/plugins/kitify/inc/framework/post-meta/ |
Current File : /www/wwwroot/fashion-kingdom.com/wp-content/plugins/kitify/inc/framework/post-meta/post-meta.php |
<?php /** * Post Meta module * * Version: 1.5.4 */ // If this file is called directly, abort. if ( ! defined( 'WPINC' ) ) { die; } if ( ! class_exists( 'Cherry_X_Post_Meta' ) ) { /** * Post meta management module. */ class Cherry_X_Post_Meta { /** * Module arguments. * * @var array */ public $args = array(); /** * Interface builder instance. * * @var object */ public $builder = null; /** * Current nonce name to check. * * @var null */ public $nonce = 'cherry-x-meta-nonce'; /** * Storage of meta values. * * @since 1.0.0 * @var array */ public $meta_values = array(); /** * Constructor for the module. * * @since 1.0.0 */ public function __construct( $args = array() ) { $this->args = wp_parse_args( $args, array( 'id' => 'cherry-post-metabox', 'title' => '', 'page' => array( 'post' ), 'context' => 'normal', 'priority' => 'high', 'single' => false, 'callback_args' => false, 'builder_cb' => false, 'fields' => array(), ) ); if ( empty( $this->args['fields'] ) ) { return; } if ( ! is_array( $this->args['page'] ) ) { $this->args['page'] = array( $this->args['page'] ); } $this->init_columns_actions(); add_action( 'admin_enqueue_scripts', array( $this, 'init_builder' ), 0 ); add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ), 10, 2 ); add_action( 'save_post', array( $this, 'save_meta' ), 10, 2 ); if ( in_array( 'attachment', $this->args['page'] ) ) { add_action( 'attachment_updated', array( $this, 'save_meta' ), 10, 2 ); } } /** * Initialize builder * * @return [type] [description] */ public function init_builder( $hook ) { global $post; if ( ! in_array( $hook, array( 'post-new.php', 'post.php' ) ) ) { return; } $post_type = get_post_type(); if ( ! in_array( $post_type, $this->args['page'] ) ) { return; } if ( ! isset( $this->args['builder_cb'] ) || ! is_callable( $this->args['builder_cb'] ) ) { return; } $this->builder = call_user_func( $this->args['builder_cb'] ); $this->get_fields( $post ); } /** * Initalize admin columns * * @return void */ public function init_columns_actions() { if ( empty( $this->args['admin_columns'] ) ) { return; } if ( ! is_array( $this->args['page'] ) ) { $pages = array( $this->args['page'] ); } else { $pages = $this->args['page']; } foreach ( $pages as $page ) { add_filter( 'manage_edit-' . $page . '_columns', array( $this, 'edit_columns' ) ); add_action( 'manage_' . $page . '_posts_custom_column', array( $this, 'manage_columns' ), 10, 2 ); } } /** * Edit admin columns * * @since 1.1.3 * @param array $columns current post table columns. * @return array */ public function edit_columns( $columns ) { foreach ( $this->args['admin_columns'] as $column_key => $column_data ) { if ( empty( $column_data['label'] ) ) { continue; } if ( ! empty( $column_data['position'] ) && 0 !== (int) $column_data['position'] ) { $length = count( $columns ); if ( (int) $column_data['position'] > $length ) { $columns[ $column_key ] = $column_data['label']; } $columns_before = array_slice( $columns, 0, (int) $column_data['position'] ); $columns_after = array_slice( $columns, (int) $column_data['position'], $length - (int) $column_data['position'] ); $columns = array_merge( $columns_before, array( $column_key => $column_data['label'], ), $columns_after ); } else { $columns[ $column_key ] = $column_data['label']; } } return $columns; } /** * Add output for custom columns. * * @since 1.1.3 * @param string $column current post list categories. * @param int $post_id current post ID. * @return void */ public function manage_columns( $column, $post_id ) { if ( empty( $this->args['admin_columns'][ $column ] ) ) { return; } if ( ! empty( $this->args['admin_columns'][ $column ]['callback'] ) && is_callable( $this->args['admin_columns'][ $column ]['callback'] ) ) { call_user_func( $this->args['admin_columns'][ $column ]['callback'], $column, $post_id ); } else { echo get_post_meta( $post_id, $column, true ); } } /** * Check if defined metabox is allowed on current page * * @since 1.0.0 * @return boolean */ public function is_allowed_page() { global $current_screen; if ( empty( $current_screen ) ) { return false; } if ( is_array( $this->args['page'] ) && ! in_array( $current_screen->id, $this->args['page'] ) ) { return false; } if ( is_string( $this->args['page'] ) && $current_screen->id !== $this->args['page'] ) { return false; } return true; } /** * Add meta box handler * * @since 1.0.0 * @param [type] $post_type The post type of the current post being edited. * @param object $post The current post object. * @return void */ public function add_meta_boxes( $post_type, $post ) { if ( ! $this->is_allowed_page() ) { return; } add_meta_box( $this->args['id'], $this->args['title'], array( $this, 'render_metabox' ), $this->args['page'], $this->args['context'], $this->args['priority'], $this->args['callback_args'] ); } /** * Render metabox funciton * * @since 1.0.0 * @param object $post The post object currently being edited. * @param array $metabox Specific information about the meta box being loaded. * @return void */ public function render_metabox( $post, $metabox ) { if ( ! $this->builder ) { return; } /** * Filter custom metabox output. Prevent from showing main box, if user output passed * * @var string */ $custom_box = apply_filters( 'cx_post_meta/custom_box', false, $post, $metabox ); if ( false !== $custom_box ) { echo $custom_box; return; } /** * Hook fires before metabox output started. */ do_action( 'cx_post_meta/meta_box/before' ); $this->builder->render(); /** * Hook fires after metabox output finished. */ do_action( 'cx_post_meta/meta_box/after' ); } /** * Safely get attribute from field settings array. * * @since 1.0.0 * @param array $field arguments array. * @param string|int|float $arg argument key. * @param mixed $default default argument value. * @return mixed */ public function get_arg( $field, $arg, $default = '' ) { if ( is_array( $field ) && isset( $field[ $arg ] ) ) { return $field[ $arg ]; } return $default; } /** * Get registered control fields * * @since 1.0.0 * @since 1.2.0 Use interface builder for HTML rendering. * @param mixed $post Current post object. * @return void */ public function get_fields( $post ) { if ( is_array( $this->args['single'] ) && isset( $this->args['single']['key'] ) ) { $this->meta_values = get_post_meta( $post->ID, $this->args['single']['key'], true ); } $zero_allowed = apply_filters( 'cx_post_meta/zero_allowed_controls', array( //'stepper', 'slider', ) ); foreach ( $this->args['fields'] as $key => $field ) { $default = $this->get_arg( $field, 'value', '' ); $value = $this->get_meta( $post, $key, $default, $field ); if ( isset( $field['options_callback'] ) ) { $field['options'] = call_user_func( $field['options_callback'] ); } $value = $this->prepare_field_value( $field, $value ); $element = $this->get_arg( $field, 'element', 'control' ); $field['id'] = $this->get_arg( $field, 'id', $key ); $field['name'] = $this->get_arg( $field, 'name', $key ); $field['type'] = $this->get_arg( $field, 'type', '' ); $field['value'] = $value; if ( 'textarea' === $field['type'] ) { $field['value'] = wp_unslash( $value ); } // Fix zero values for stepper and slider if ( ! $value && in_array( $field['type'], $zero_allowed ) ) { $field['value'] = 0; } $register_callback = 'register_' . $element; if ( method_exists( $this->builder, $register_callback ) ) { call_user_func( array( $this->builder, $register_callback ), $field ); } } } /** * Prepare field value. * * @param $field * @param $value * * @return array */ public function prepare_field_value( $field, $value ) { switch ( $field['type'] ) { case 'repeater': if ( is_array( $value ) && ! empty( $field['fields'] ) ) { $repeater_fields = $field['fields']; foreach ( $value as $item_id => $item_value ) { foreach ( $item_value as $repeater_field_id => $repeater_field_value ) { $value[ $item_id ][ $repeater_field_id ] = $this->prepare_field_value( $repeater_fields[ $repeater_field_id ], $repeater_field_value ); } } } break; case 'checkbox': if ( ! empty( $field['is_array'] ) && ! empty( $field['options'] ) && ! empty( $value ) ) { $adjusted = array(); if ( ! is_array( $value ) ) { $value = array( $value ); } foreach ( $value as $val ) { $adjusted[ $val ] = 'true'; } foreach ( $field['options'] as $opt_val => $opt_label ) { if ( ! in_array( $opt_val, $value ) ) { $adjusted[ $opt_val ] = 'false'; } } $value = $adjusted; } break; } return $value; } /** * Save additional taxonomy meta on edit or create tax * * @since 1.0.0 * @param int $post_id The ID of the current post being saved. * @param object $post The post object currently being saved. * @return void|int */ public function save_meta( $post_id, $post = '' ) { if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) { return; } if ( empty( $_POST ) || ! isset( $_POST['_wpnonce'] ) ) { return; } $posts = ! empty( $this->args['page'] ) ? $this->args['page'] : array( 'post' ); $posts = is_array( $posts ) ? $posts : array( $posts ); $maybe_break = false; foreach ( $posts as $post_type ) { if ( get_post_type( $post_id ) !== $post_type ) { $maybe_break = true; continue; } $maybe_break = false; $obj = get_post_type_object( $post_type ); if ( ! isset( $obj->cap->edit_posts ) || ! current_user_can( $obj->cap->edit_posts ) ) { $maybe_break = true; continue; } break; } if ( true === $maybe_break ) { return; } if ( ! $this->is_allowed_page() ) { return; } if ( ! is_object( $post ) ) { $post = get_post(); } /** * Hook on before current metabox saving for all meta boxes */ do_action( 'cx_post_meta/before_save', $post_id, $post ); /** * Hook on before current metabox saving with meta box id as dynamic part */ do_action( 'cx_post_meta/before_save/' . $this->args['id'], $post_id, $post ); if ( is_array( $this->args['single'] ) && isset( $this->args['single']['key'] ) ) { $this->save_meta_mod( $post_id ); } else { $this->save_meta_option( $post_id ); } /** * Hook on after current metabox saving with meta box id as dynamic part */ do_action( 'cx_post_meta/after_save/' . $this->args['id'], $post_id, $post ); /** * Hook on after current metabox saving for all meta boxes */ do_action( 'cx_post_meta/after_save', $post_id, $post ); } /** * Save all meta values as a one array value in `wp_postmeta` table. * * @since 1.1.0 * @param int $post_id Post ID. */ public function save_meta_mod( $post_id ) { $meta_key = $this->args['single']['key']; // Array of new post meta value. $new_meta_value = array(); if ( empty( $_POST[ $meta_key ] ) ) { return; } foreach ( $_POST[ $meta_key ] as $key => $value ) { $new_meta_value[ $key ] = $this->sanitize_meta( $key, $value ); } // Get current post meta data. $meta_value = get_post_meta( $post_id, $meta_key, true ); if ( $new_meta_value && '' == $meta_value ) { add_post_meta( $post_id, $meta_key, $new_meta_value, true ); } elseif ( $new_meta_value && $new_meta_value != $meta_value ) { update_post_meta( $post_id, $meta_key, $new_meta_value ); } elseif ( empty( $new_meta_value ) && $meta_value ) { delete_post_meta( $post_id, $meta_key, $meta_value ); } } /** * Save each meta value as a single value in `wp_postmeta` table. * * @since 1.1.0 * @param int $post_id Post ID. */ public function save_meta_option( $post_id ) { foreach ( $this->args['fields'] as $key => $field ) { if ( isset( $field['element'] ) && 'control' !== $field['element'] ) { continue; } $pre_processed = apply_filters( 'cx_post_meta/pre_process_key/' . $key, false, $post_id, $key ); if ( $pre_processed ) { continue; } if ( ! isset( $_POST[ $key ] ) || '' === $_POST[ $key ] ) { /** * Fires before specific key will be deleted */ do_action( 'cx_post_meta/before_delete_meta/' . $key, $post_id, $key ); update_post_meta( $post_id, $key, false ); continue; } if ( $this->to_timestamp( $field ) ) { $value = strtotime( $_POST[ $key ] ); } else { $value = $this->sanitize_meta( $key, $_POST[ $key ] ); } /** * Fires on specific key saving */ do_action( 'cx_post_meta/before_save_meta/' . $key, $post_id, $value, $key ); if ( 'textarea' === $field['type'] && false === strpos( $value, "\\" ) ) { $value = wp_slash( $value ); } update_post_meta( $post_id, $key, $value ); } } /** * Is date field * * @param [type] $input_type [description] * @return boolean [description] */ public function to_timestamp( $field ) { if ( empty( $field['input_type'] ) ) { return false; } if ( empty( $field['is_timestamp'] ) ) { return false; } if ( ! in_array( $field['input_type'], array( 'date', 'datetime-local' ) ) ) { return false; } return ( true === $field['is_timestamp'] ); } /** * Sanitize passed meta value * * @since 1.1.3 * @param string $key Meta key to sanitize. * @param mixed $value Meta value. * @param array $fields Meta fields array. * @return mixed */ public function sanitize_meta( $key, $value, $fields = null ) { $fields = ! $fields ? $this->args['fields'] : $fields; $field = $fields[ $key ]; if ( 'repeater' === $field['type'] && ! empty( $field['fields'] ) && is_array( $value ) ) { $repeater_fields = $field['fields']; foreach ( $value as $item_id => $item_value ) { foreach ( $item_value as $repeater_field_id => $repeater_field_value ) { $value[ $item_id ][ $repeater_field_id ] = $this->sanitize_meta( $repeater_field_id, $repeater_field_value, $repeater_fields ); } } } if ( 'checkbox' === $field['type'] && ! empty( $field['is_array'] ) ) { $raw = ! empty( $value ) ? $value : array(); $result = array(); if ( is_array( $raw ) ) { foreach ( $raw as $raw_key => $raw_value ) { $bool_value = filter_var( $raw_value, FILTER_VALIDATE_BOOLEAN ); if ( $bool_value ) { $result[] = $raw_key; } } } return $result; } if ( empty( $field['sanitize_callback'] ) ) { return $this->sanitize_deafult( $value ); } if ( ! is_callable( $field['sanitize_callback'] ) ) { return $this->sanitize_deafult( $value ); } return call_user_func( $field['sanitize_callback'], $value, $key, $field ); } /** * Cleare value with sanitize_text_field if not is array * * @since 1.1.3 * @param mixed $value Passed value. * @return mixed */ public function sanitize_deafult( $value ) { return is_array( $value ) ? $value : sanitize_text_field( $value ); } /** * Retrieve post meta field. * * @since 1.1.0 * @since 1.2.0 Process default value. * * @param object $post Current post object. * @param string $key The meta key to retrieve. * @param mixed $default Default value. * @param array $field Meta field apropriate to current key. * @return string */ public function get_meta( $post, $key, $default = false, $field = array() ) { if ( ! is_object( $post ) ) { return ''; } $pre_value = apply_filters( 'cx_post_meta/pre_get_meta/' . $key, false, $post, $key, $default, $field ); if ( false !== $pre_value ) { return $pre_value; } if ( is_array( $this->args['single'] ) && isset( $this->args['single']['key'] ) ) { return isset( $this->meta_values[ $key ] ) ? $this->meta_values[ $key ] : $default; } $meta = get_post_meta( $post->ID, $key, false ); if ( ! empty( $meta[0] ) && $this->to_timestamp( $field ) ) { switch ( $field['input_type'] ) { case 'date': return date( 'Y-m-d', $meta[0] ); case 'datetime-local': return date( 'Y-m-d\TH:i', $meta[0] ); } } return ( empty( $meta ) ) ? $default : $meta[0]; } /** * Returns the instance. * * @since 1.0.0 * @return object */ public static function get_instance( $core, $args ) { if ( ! is_admin() ) { return; } return new self( $core, $args ); } } }