use_select_chosen = $use; } public function get_use_select_chosen() { return (bool)$this->use_select_chosen; } public function set_use_datetime_picker($use) { $this->use_datetime_picker = $use; } public function get_use_datetime_picker() { return (bool)$this->use_datetime_picker; } public function set_use_color_picker($use) { $this->use_color_picker = $use; } public function get_use_color_picker() { return (bool)$this->use_color_picker; } public function set_edit_callback($edit_callback) { $this->edit_callback = $edit_callback; } public function get_edit_callback() { return $this->edit_callback; } public function set_use_media_upload($use) { $this->use_media_upload = $use; } public function get_use_media_upload() { return (bool)$this->use_media_upload; } public function set_column($column) { $this->column = $column; } public function get_column() { return $this->column; } public function set_translation($translation) { $this->translation = $translation; } public function get_translation() { return $this->translation; } public function set_add_callback($add_callback) { $this->add_callback = $add_callback; } public function get_add_callback() { return $this->add_callback; } public function set_taxonomies($taxonomies) { $this->taxonomies = $taxonomies; } public function get_taxonomies() { return $this->taxonomies; } public function add_taxonomy($taxonomy) { $this->taxonomies[] = $taxonomy; $this->set_taxonomies(fansub_sanitize_array($this->get_taxonomies())); } public function set_show($show) { $this->show = $show; } public function get_show() { return $this->show; } public function set_callback_args($callback_args) { $this->callback_args = $callback_args; } public function get_callback_args() { return $this->callback_args; } public function set_priority($priority) { $this->priority = $priority; } public function get_priority() { return $this->priority; } public function set_context($context) { $this->context = $context; } public function get_context() { return $this->context; } public function set_callback($callback) { $this->callback = $callback; } public function get_callback() { return $this->callback; } public function set_id($id) { $this->id = $id; } public function get_id() { return $this->id; } public function set_post_types($post_types) { if(!is_array($post_types)) { $post_types = array($post_types); } $this->post_types = $post_types; } public function get_post_types() { return $this->post_types; } public function add_post_type($post_type) { $this->post_types[] = $post_type; $this->set_post_types(fansub_sanitize_array($this->get_post_types())); } public function set_title($title) { $this->title = $title; } public function get_title() { return $this->title; } public function set_fields($fields) { $this->fields = $fields; } public function get_fields() { return $this->fields; } public function add_field($args) { $callback = fansub_get_value_by_key($args, 'field_callback'); $field_args = isset($args['field_args']) ? $args['field_args'] : $args; $data_type = fansub_get_value_by_key($args, 'data_type', 'default'); if('fansub_field_datetime_picker' == $callback) { $this->set_use_datetime_picker(true); $field_args['type'] = 'datetime'; $args['type'] = 'datetime'; $data_type = 'datetime'; } elseif('fansub_field_color_picker' == $callback) { $this->set_use_color_picker(true); } elseif('fansub_field_media_upload' == $callback) { $this->set_use_media_upload(true); } elseif('fansub_field_select_chosen' == $callback) { $this->set_use_select_chosen(true); } $this->sanitize_field_args($field_args); if(isset($args['options'])) { $field_args['options'] = $args['options']; } if($this->get_type() != 'post' && !isset($field_args['label']) && isset($field_args['title'])) { $field_args['label'] = $field_args['title']; } $field_args['data_type'] = $data_type; $args['field_args'] = $field_args; $this->fields[] = $args; } public function set_type($type) { $this->type = $type; } public function get_type() { return $this->type; } public function __construct($type) { $this->set_type($type); $this->set_post_types(array()); $this->set_taxonomies(array()); $this->set_fields(array()); $this->set_title(__('Extra information', 'fansub')); $this->set_id('fansub_custom_meta'); $this->set_context('normal'); $this->set_priority('high'); } public function init() { if($this->is_term_meta()) { $this->term_meta_init(); } elseif($this->is_menu_item_meta()) { $this->menu_item_meta_init(); } else { $this->post_meta_box_init(); } } public function add_custom_menu_item_meta_field($item, $args, $depth) { echo '
'; } public function load_style_and_script() { if($this->get_use_media_upload()) { add_filter('fansub_wp_enqueue_media', '__return_true'); } if($this->get_use_color_picker()) { add_filter('fansub_use_color_picker', '__return_true'); } if($this->get_use_datetime_picker()) { add_filter('fansub_admin_jquery_datetime_picker', '__return_true'); } if($this->get_use_select_chosen()) { add_filter('fansub_use_chosen_select', '__return_true'); } } public function add_menu_item_meta($menu_item) { foreach($this->get_fields() as $field) { $name = $field['field_args']['name']; $menu_item->{$name} = fansub_get_post_meta($this->build_menu_item_meta_key($name), $menu_item->ID); } return $menu_item; } public function build_menu_item_meta_key($key_name) { $key_name = str_replace('-', '_', $key_name); return '_menu_item_' . $key_name; } public function menu_item_meta_init() { global $pagenow; $this->load_style_and_script(); if('nav-menus.php' == $pagenow) { add_filter('fansub_use_admin_style_and_script', '__return_true'); } add_filter('wp_setup_nav_menu_item', array($this, 'setup_nav_menu_item')); add_action('wp_update_nav_menu_item', array($this, 'update_nav_menu_item'), 10, 3); add_filter('wp_edit_nav_menu_walker', array($this, 'edit_nav_menu_walker'), 10, 2); add_action('fansub_edit_menu_item_field', array($this, 'add_custom_menu_item_meta_field'), 10, 3); add_filter('fansub_setup_nav_menu_item', array($this, 'add_menu_item_meta')); } public function setup_nav_menu_item($menu_item) { $menu_item = apply_filters('fansub_setup_nav_menu_item', $menu_item); return $menu_item; } public function update_nav_menu_item($menu_id, $menu_item_db_id, $args) { do_action('fansub_update_nav_menu_item', $menu_id, $menu_item_db_id, $args); foreach($this->get_fields() as $field) { $name = $field['field_args']['name']; $this->update_menu_item_meta_on_save($name, $menu_item_db_id); } } public function update_menu_item_meta_on_save($field_name, $menu_item_db_id) { $field_name = str_replace('_', '-', $field_name); $key = 'menu-item-' . $field_name; if(isset($_REQUEST[$key]) && is_array($_REQUEST[$key])) { $value = $_REQUEST[$key][$menu_item_db_id]; update_post_meta($menu_item_db_id, $this->build_menu_item_meta_key($field_name), $value); } } function edit_nav_menu_walker($walker, $menu_id) { $walker = apply_filters('fansub_edit_nav_menu_walker', 'FANSUB_Menu_Edit_Walker', $menu_id); return $walker; } public function build_menu_item_field_id($field_name, $item_id) { $id = str_replace('_', '-', $field_name); return 'edit-menu-item-' . $id . '-' . $item_id; } public function build_menu_item_field_name($field_name, $item_id) { $name = str_replace('_', '-', $field_name); return 'menu-item-' . $name . '[' . $item_id . ']'; } public function build_menu_item_field_class($field_name) { $field_name = str_replace('_', '-', $field_name); return 'edit-menu-item-' . $field_name; } public function build_menu_item_field_data($field_name, $item_id) { $result = array( 'id' => $this->build_menu_item_field_id($field_name, $item_id), 'name' => $this->build_menu_item_field_name($field_name, $item_id), 'class' => $this->build_menu_item_field_class($field_name) ); return $result; } public function term_meta_init() { global $pagenow; $this->load_style_and_script(); if('edit-tags.php' == $pagenow || 'term.php' == $pagenow) { add_filter('fansub_use_admin_style_and_script', '__return_true'); } foreach($this->get_taxonomies() as $taxonomy) { add_action($taxonomy . '_add_form_fields', array($this, 'term_field_add_page')); add_action($taxonomy . '_edit_form_fields', array($this, 'term_field_edit_page')); add_action('edited_' . $taxonomy, array($this, 'save_term_data')); add_action('created_' . $taxonomy, array($this, 'save_term_data')); } } public function term_field_add_page($taxonomy) { if(fansub_callback_exists($this->get_add_callback())) { call_user_func($this->get_add_callback(), $taxonomy); } else { foreach($this->get_fields() as $field) { $on_add_page = isset($field['on_add_page']) ? $field['on_add_page'] : false; if($on_add_page) { $callback = isset($field['field_callback']) ? $field['field_callback'] : 'fansub_field_input'; if(fansub_callback_exists($callback)) { $field_args = isset($field['field_args']) ? $field['field_args'] : array(); $id = isset($field_args['id']) ? $field_args['id'] : ''; $name = isset($field_args['name']) ? $field_args['name'] : ''; fansub_transmit_id_and_name($id, $name); $class = 'term-' . $name . '-wrap'; $class = fansub_sanitize_file_name($class); fansub_add_string_with_space_before($class, 'form-field fansub'); ?>' . sprintf(__('The callback function %s does not exists!', 'fansub'), '' . $callback . '') . '
'; } } } do_action('fansub_post_meta_box_field', $this); $current_post_type = fansub_get_current_post_type(); if(!empty($current_post_type)) { do_action('fansub_' . $current_post_type . '_meta_box_field'); } do_action('fansub_meta_box_' . $this->get_id() . '_field'); ?>