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

时间:2010-08-17 作者:Bobby Jack

我正在尝试设置以下自定义帖子类型this tutorial. 然而,我对如何/在何处实现有点困惑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\\u post”操作限制为仅触发自定义类型的帖子。

6 个回复
最合适的回答,由SO网友:John P Bloch 整理而成

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\\u post”钩子将post的ID作为参数传递。

编辑

我更新了功能以反映简的评论。谢谢Jan!

SO网友:EAMann

如果要处理多个帖子类型,我建议使用一个基本的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 开关中的块处理post类型不在自定义集中的情况。

SO网友:MikeSchinkel

@John P Bloch和@EAMann已经给出了很好的答案,因此我的答案是:

考虑在meta\\u键前面加下划线。这样做会将它们隐藏在编辑后屏幕上显示的自定义字段列表中,即

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\']);
}
显然,这意味着您也需要一个自定义的metabox来编辑字段。这里有一个上下文编辑屏幕:



  • 您可以做的另一件事是添加自己的挂钩,以便更轻松地保存特定的帖子类型,即挂钩可以是“save_{$post_type}_post“为了一个movie 应该是post类型save_movie_post. 以下是您必须为主题添加的内容functions.php 文件或插件中的某个位置:

    add_action(\'save_post\', \'save_custom_post_type_posts\',10,2);
    function 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);
    function save_my_postype_metadata($post_id,$post) {
        update_post_meta($post_id, \'_my_metadata\', $_POST[\'my_metadata\']);
    }
  • SO网友:prettyboymp

    就我个人而言,我更喜欢按照以下模式向post类型添加自定义元处理程序。使用下面的命令,您可以通过调用add\\u post\\u type\\u support(“my\\u post\\u type”,“subtitle”)将支持键(“subtitle”)添加到post类型的支持数组中,从而将元支持添加到post类型中;

    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\'));
    
    希望这样的东西很快就会添加到core中。

    SO网友:hakre

    更新前检查当前帖子是否属于您的帖子类型。这将确保您不会为所有帖子保存它。

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

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

    SO网友:jrutter

    我无法实现这一点-不确定我做错了什么-但我尝试使用post\\u updated hook而不是save\\u 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\');
    

    结束

    相关推荐