it-swarm.cn

如何仅保存特定自定义帖子类型的元数据?

我正在尝试设置一个自定义帖子类型 本教程 。但是,我对如何/在哪里实现update_post_meta()感到有点困惑。教程建议使用此模式:

add_action('save_post', 'save_my_metadata');

function save_my_metadata()
{
    global $post;
    update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}

哪个确实有效,但是对每个帖子添加元数据会产生不幸的影响,无论它是否属于此自定义类型。

我把上面的内容放在functions.php中,我猜这可能是问题的一部分。我猜我需要限制'save_post'动作才能触发我的自定义类型的帖子。

15
Bobby Jack
function save_my_metadata($ID = false, $post = false)
{
    if($post->post_type != 'your_post_type')
        return;
    update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}

这应该工作。只需将'your_post_type'替换为帖子类型的名称即可。另外,鲜为人知的事实是:'save_post'挂钩将帖子的ID作为参数传递。

编辑

我更新了函数以反映Jan的评论。谢谢Jan!

16
John P Bloch

如果你想处理多种帖子类型,我建议一个基本的switch语句:

add_action('save_post', 'save_my_metadata');

function save_my_metadata($ID = false, $post = false)
{
    switch($post->post_type) 
    {
        case 'post_type_1':
            // Do stuff for post type 1
            update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
            break;
        case 'post_type_2':
            // Do stuff for post type 2
            break;
        default:
            return;
    }
}

这些情况与if($post->post_type) == 'post_type_1') {}基本相同但不需要多个if-else块。交换机中的default块处理邮政类型不在自定义集中的情况。

4
EAMann

@John P Bloch和@EAMann已经给出了很好的答案,所以我的另外一个:

  1. 考虑 使用下划线为meta_keys添加前缀。这样做会将其隐藏在帖子编辑屏幕上显示的自定义字段列表中,即.

    function save_my_metadata($ post_id,$ post = false){
     if($ post-> post_type =='your_post_type')[。_____。] update_post_meta($ post_id,'_ my_metadata',$ _POST ['my_metadata' ]); 
    } 
    
    显然,这意味着您需要一个自定义元数据框才能编辑字段。这是上下文的编辑屏幕:



  2. 你可以做的另一件事就是添加你自己的钩子,以便更容易保存特定的帖子类型,即你的钩子可以是“save_{$post_type}_post”;对于movie帖子类型,它将是save_movie_post。以下是您必须添加到主题的functions.php文件或某个插件中的插件:

     add_action('save_post','save_custom_post_type_posts',10,2); 
    函数save_custom_post_type_posts($ post_id,$ post = false){[。_____。] do_action(“save _ {$ post- > post_type} _POST“); 
    } 
    
    然后你可以像这样重写原始代码(包括上面#1的下划线技巧):

     add_action('save_my_postype_post','save_my_postype_metadata',10,2); 
    函数save_my_postype_metadata($ post_id,$ post){
     update_post_meta($ post_id,'_ my_metadata',$ _POST [ 'my_metadata']); 
    }
4
MikeSchinkel

就个人而言,我更喜欢按照以下模式为帖子类型添加自定义元处理程序。通过下面的内容,您可以通过调用add_post_type_support('my_post_type','subtitle')将post支持键(下例中的'subtitle')添加到post类型的supports数组中,将元支持添加到帖子类型中;

class Subtitle_Meta_Handler {
    public function initialize() {
        add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
        add_action('save_post', array($this, 'update'));
    }

    public function add_metabox($post_type, $post)
    {
        if(post_type_supports($post_type, 'subtitle'))
        {
            add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
        }
    }

    public function metabox($post)
    {
        $subtitle = get_post_meta($post->ID, 'subtitle', true);
        if(!$subtitle)
        {
            $subtitle = '';
        }
        ?>
        <input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
        <?php
        wp_nonce_field('update_subtitle', 'subtitle_nonce');
    }

    public function update($post_id)
    {
        if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
            return $post_id;
        }
        if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
            $subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
            if(empty($subtitle)) {
                delete_post_meta($post_id, 'subtitle');
            } else {
                update_post_meta($post_id, 'subtitle', $subtitle);
            }
        }
    }
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));

希望这样的事情很快就会被添加到核心。

1
prettyboymp

我不能让它工作 - 不知道我做错了什么 - 但我试图使用post_updated挂钩而不是save_post - 因为我希望在帖子更新后插入这些值,以便我可以从其他自定义字段中检索值。

 function update_meta ($ID = false, $post = false) {
  update_post_meta($ID, 'rest_long', 'Test 1');
  update_post_meta($ID, 'rest_lat', 'Test 2');
}

add_action('post_updated', 'update_meta');
0
jrutter

事先更新检查当前帖子是否属于您的后期类型。这样可以确保您不会为所有帖子保存它。

您还应该检查输入(在您的示例中缺少),然后在此旁边,请记住,您可能只在该post-type处于活动状态时添加操作。如果是这种情况,您以后不需要检查该帖子类型。

获取帖子类型: get_post_type()$post->post_type;

0
hakre