<?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 );
Loading ...