web-dev-qa-db-ja.com

特定のカスタム投稿タイプのメタデータのみを保存する方法

このチュートリアル に従ってカスタム投稿タイプを設定しようとしています。しかしながら、私は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')を呼び出して、サポートタイプ(次の例では 'subtitle')を投稿タイプの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

他のカスタムフィールドから値を取得できるように、投稿が更新された後にこれらの値を挿入する必要があるため、これを機能させることはできません。 。

 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

前回の更新で、現在の投稿があなたの投稿タイプであるかどうかを確認してください。それはあなたがすべての投稿のためにそれを保存しないのを確実にするでしょう。

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

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

0
hakre