特定のカスタム投稿タイプのメタデータのみを保存するにはどうすればよいですか?


16

このチュートリアルに従ってカスタム投稿タイプを設定しようとしています。ただし、実装方法や場所としては少し混乱しています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」アクションを、カスタムタイプの投稿に対してのみトリガーするように制限する必要があると思います。


ボビー・ジャックのいい質問ですが、「特定のカスタム投稿タイプのメタデータのみを保存する方法」のような質問にタイトルを変更してもらえますか。タイトルが一般的すぎるため、人々がこの問題の解決策を探していることを認識できません。
-MikeSchinkel

@マイク:完了(提案に完全に同意、感謝!)
ボビージャック

回答:


18
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のコメントを反映するように関数を更新しました。1月ありがとう!


1
さらに、投稿自体を2番目の引数として追加するため、グローバル変数を使用する必要はありません。
ヤンファブリ

このソリューションは機能します...私は以前にクライアントプロジェクトでそれを使用し、多くの成功を収めました。
EAMann

華麗な魅力のような作品。そして、「if($ post-> post_type == 'animal'){update_post_meta($ ID、 "number_of_legs"、$ _POST ['number_of_legs']);} else if($ post-> post_type == 'vehicle'){update_post_meta($ ID、 "number_of_wheels"、$ _POST ['number_of_wheels']);} // ...など...いくつかの異なる投稿タイプを処理するには?(謝罪コメントのフォーマット機能が悪い!)
ボビージャック

実際、複数の投稿タイプがある場合は、代わりにswitchステートメントを使用することをお勧めします。マークアップが少なく、パフォーマンスが速く、将来ケースを追加しやすくなります。
EAMann

@EAMann-そう、執筆の途中で、スイッチの方が良いと気づいたが、コメントはコードの編集を始めるのに理想的な場所ではないので、怠けた;)
ボビージャック

4

複数の投稿タイプを処理する場合、基本的な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

@John P Blochと@EAMannはすでに素晴らしい答えを出しているので、私も追加しています:

  1. meta_keysの前にアンダースコア付けることを検討してください。そうすると、投稿編集画面に表示されるカスタムフィールドのリストからそれらが非表示になります。

    関数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']);
    }

1

個人的に、投稿タイプにカスタムメタハンドラーを追加するには、以下のパターンに従うことを好みます。以下を使用すると、add_post_type_support( 'my_post_type'、 'subtitle')を呼び出すことにより、サポートタイプ(以下の例では 'subtitle')を投稿タイプのサポート配列に追加するだけで、投稿タイプにメタサポートを追加できます。

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'));

このようなものがすぐにコアに追加されることを願っています。


0

事前更新では、現在の投稿が投稿タイプであるかどうかを確認します。これにより、すべての投稿に保存する必要がなくなります。

入力も確認する必要があります(この例では欠落しています)。その横には、そのpost-typeがアクティブな場合にのみアクションを追加できることに注意してください。その場合は、後でその投稿タイプを確認する必要はありません。

投稿タイプの取得:get_post_type()または$post->post_type;


0

私はこれを機能させることはできません-何が間違っているのかわかりませんが、save_postの代わりにpost_updatedフックを使用しようとしています-他のカスタムフィールドから値を取得できるように投稿が更新された後にこれらの値を挿入したいので。

 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');

ネバーマインド-私はそれを理解しました!
-jrutter
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.