即时通讯发布一个基类我用于自定义帖子类型,它不是我的代码,我不记得我在哪里拿起它,但信贷给创造者!它对我通常创建自定义帖子非常有效,它应该与您的代码一起工作(请参阅下文,我试图快速重现您的功能)。希望它有帮助!
btw:您可以通过使用post_meta来存储帖子的自定义信息(您可以使用postid来拉取此信息)。让我知道如果这不清楚,生病在pastebin做些什么。
class base_posttype {
public $post_type_name;
public $post_type_variables;
public $post_type_labels;
public $meta_keys;
public $result= array();
public function __construct($name, $variables= array(), $labels=array()) {
$this->post_type_name = $name ;
$this->post_type_variables = $variables;
$this->post_type_labels = $labels;
if(! post_type_exists ($this-> post_type_name)){
add_action ('init', array(&$this, 'register_post_type'));
}
$this->save();
} //------------end construct------------------------------------------
public function register_post_type() {
$name = ucwords(str_replace('_', ' ', $this->post_type_name));
$plural = $name . 's';
$labels = array_merge(
// Default
array(
'name' => _x($plural, 'post type general name'),
'singular_name' => _x($name, 'post type singular name'),
'add_new' => _x('Add New', strtolower($name)),
'add_new_item' => __('Add New ' . $name),
'edit_item' => __('Edit ' . $name),
'new_item' => __('New ' . $name),
'all_items' => __('All ' . $plural),
'view_item' => __('View ' . $name),
'search_items' => __('Search ' . $plural),
'not_found' => __('No ' . strtolower($plural) . ' found'),
'not_found_in_trash' => __('No ' . strtolower($plural) . ' found in Trash'),
'parent_item_colon' => '',
'menu_name' => $plural
),
$this->post_type_labels
);
$args = array_merge(
array(
'label' => $plural,
'labels' => $labels,
'public' => true,
'show_ui' => true,
'supports' => array('title', 'editor'),
'show_in_nav_menus' => true,
'_builtin' => false,
),
// Given args
$this->post_type_args
);
// Register the post type
$this->result[]=register_post_type($this->post_type_name, $args);
}
/* attach the taxonomy to the post type */
public function add_taxonomy($name, $args = array(), $labels = array()) {
if(! empty($name)) {
$post_type_name = $this->post_type_name;
// Taxonomy properties
$taxonomy_name = strtolower(str_replace(' ', '_', $name));
$taxonomy_labels = $labels;
$taxonomy_args = $args;
if(! taxonomy_exists($taxonomy_name)) {
//Capitilize the words and make it plural
$name = ucwords(str_replace('_', ' ', $name));
$plural = $name . 's';
// Default labels, overwrite them with the given labels.
$labels = array_merge(
// Default
array(
'name' => _x($plural, 'taxonomy general name'),
'singular_name' => _x($name, 'taxonomy singular name'),
'search_items' => __('Search ' . $plural),
'all_items' => __('All ' . $plural),
'parent_item' => __('Parent ' . $name),
'parent_item_colon' => __('Parent ' . $name . ':'),
'edit_item' => __('Edit ' . $name),
'update_item' => __('Update ' . $name),
'add_new_item' => __('Add New ' . $name),
'new_item_name' => __('New ' . $name . ' Name'),
'menu_name' => __($name),
),
// Given labels
$taxonomy_labels
);
// Default arguments, overwritten with the given arguments
$args = array_merge(
// Default
array(
'label' => $plural,
'labels' => $labels,
'public' => true,
'show_ui' => true,
'show_in_nav_menus' => true,
'_builtin' => false,
),
// Given
$taxonomy_args
);
// Add the taxonomy to the post type
add_action('init', function() use($taxonomy_name, $post_type_name, $args) {
register_taxonomy($taxonomy_name, $post_type_name, $args);
});
} else {
add_action('init', function() use($taxonomy_name, $post_type_name) {
register_taxonomy_for_object_type($taxonomy_name, $post_type_name);
});
}
}
}
/* Attaches meta boxes to the post type */
public function add_meta_box($title, $fields = array(), $context = 'normal', $priority = 'default') {
// We need to know the Post Type name again
$post_type_name = $this->post_type_name;
// Meta variables
$box_id = strtolower(str_replace(' ', '_', $title));
$box_title = ucwords(str_replace('_', ' ', $title));
$box_context = $context;
$box_priority = $priority;
// Make the fields global
global $custom_fields;
$custom_fields[$title] = $fields;
add_action('admin_init', function() use($box_id, $box_title, $post_type_name, $box_context, $box_priority, $fields) {
add_meta_box($box_id, $box_title, function($post, $data) {
global $post;
// Nonce field for some validation
wp_nonce_field(plugin_basename(__FILE__), 'custom_post_type');
// Get all inputs from $data
$custom_fields = $data['args'][0];
// Get the saved values
$meta = get_post_custom($post->ID);
// Check the array and loop through it
if(! empty($custom_fields)) {
/* Loop through $custom_fields */
foreach($custom_fields as $label => $type) {
$field_id_name = strtolower(str_replace(' ', '_', $data['id'])) . '_' . strtolower(str_replace(' ', '_', $label));
echo '<label for="' . $field_id_name . '">' . $label . '</label><input type="text" name="custom_meta[' . $field_id_name . ']" id="' . $field_id_name . '" value="' . $meta[$field_id_name][0] . '" />';
}
}},
$post_type_name,
$box_context,
$box_priority,
array($fields)
);
});
}
/* Listens for when the post type being saved */
public function save() {
// Need the post type name again
$post_type_name = $this->post_type_name;
add_action('save_post', function() use($post_type_name) {
// Deny the WordPress autosave function
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
if (! wp_verify_nonce($_POST['custom_post_type'], plugin_basename(__FILE__))) return;
global $post;
if(isset($_POST) && isset($post->ID) && get_post_type($post->ID) == $post_type_name)
{
global $custom_fields;
// Loop through each meta box
foreach($custom_fields as $title => $fields)
{
// Loop through all fields
foreach($fields as $label => $type)
{
$field_id_name = strtolower(str_replace(' ', '_', $title)) . '_' . strtolower(str_replace(' ', '_', $label));
update_post_meta($post->ID, $field_id_name, $_POST['custom_meta'][$field_id_name]);
}
}
}
});
}
}
然后您可以使用此类创建帖子,例如
class project_post_type {
public function __construct() {
$project= new base_posttype ('project', array(
'has_archive' => TRUE,
'menu_position' => 10,
'rewrite' => array(
'slug' => 'our-people',
'with_front' => FALSE,
),
'supports' => array('title', 'editor', 'thumbnail', 'comments', 'custom-fields', 'revisions'),
'menu_icon' => AD_URL . '/resources/img/adlogo.png'
));
$project->add_taxonomy('location');
$project->add_taxonomy ('categories', array(
'hierarchical' => true
));
$project->add_meta_box('Project Info' , array(
'price' => 'text',
'condition' => 'text',
'age' => 'text',
'expiration_date' => 'text', // int
'fee' => 'text',
'discount' => 'text',
'due' => 'text',
'paid' => 'text',
'sold' => 'text' //boolan
)
);
}
}
$project= new project_post_type;
通常,如果我有数据的阵列我需要使用为后型,i设定它的类内,所以一个方法拉元密钥和一个方法来保存,大部分时间不必要的,但在有些情况下,我喜欢从前端提交表单,它派上用场。
美丽!我没有意识到'register_meta_box_cb'调用的函数会自动发送'$ post'。通过任何机会让你知道是否有方法将数据数组存储/关联到自定义帖子类型? –
@AndyM我更新了答案,并举例说明了如何将数据数组存储/关联到自定义帖子类型。希望这个帮助。 – birgire
看起来不错,我会在3小时内给你赏金。 –