web-dev-qa-db-ja.com

公開時にカスタム投稿タイプにメタ値を追加する

特定のカスタム投稿タイプ( 'custom-jobs')のすべての投稿を、Yoast SEOプラグインのサイトマップに自動的に含めるように設定することを要求しているクライアントがいます。

これを行うには、投稿に '_yoast_wpseo_sitemap-include'というメタキーと 'always'という値が必要であることがわかりました。そこで、{status} _ {post_type}フックを使って次のように関数を呼び出そうとしました。

function on_jobs_publish( $post_ID ) {
    global $wpdb;
    $wpdb->insert( 
        'iCrewzWp_postmeta', 
        array( 
            'post_id' => $post->ID,
            'meta_key' => '_yoast_wpseo_sitemap-include',
            'meta_value' => 'always'
        ), 
        array( 
            '%d',
            '%s',
            '%s'
        ) 
    );
}
add_action(  'publish_custom-jobs',  'on_jobs_publish', 10, 1 );

これはほとんどうまくいきます。メタ情報をDBに追加しますが、post_idは常に0に設定されています。$ postおよび$ ID変数を渡して使用してみましたが、運が悪くなったことはありません。カスタム投稿のIDをこの関数に渡してメタ情報を公開された投稿に関連付ける方法を教えてください。

1
MattR

コード内に$post->IDオブジェクトへの参照がないため、未定義の$post変数を使用することになります。代わりに、関数で取得した$post_ID変数を使用してください。

function on_jobs_publish( $post_ID ) {
   global $wpdb;
   $wpdb->insert( 
       'iCrewzWp_postmeta', 
            array( 
                'post_id' => $post_ID,
                'meta_key' => '_yoast_wpseo_sitemap-include',
                'meta_value' => 'always'
        ), 
        array( 
            '%d',
            '%s',
            '%s'
        ) 
    );
}
add_action(  'publish_custom-jobs',  'on_jobs_publish', 10, 1 );

また、global $wp_queryを操作してinsertメソッドを実行するのではなく、ユーザーupdate_post_meta関数を使用する方が良いと思います。

function on_jobs_publish( $post_ID ) {
    update_post_meta($post_ID, '_yoast_wpseo_sitemap-include', 'always' );
}
add_action(  'publish_custom-jobs',  'on_jobs_publish', 10, 1 );

投稿がステータスを任意の値から "publish"に変更したときにpublish_{post-type}アクションがトリガされることに注意してください。つまり、投稿がすでに公開されていて更新しようとした場合、この機能は実行されません。投稿ステータスを気にせずに実行する必要がある場合は、 save_post アクションフックを使用してください。

function on_jobs_publish( $post_ID, $post ) {
    //Check that the post type being edited is our custom post type
    if ( $post->post_type != 'custom-jobs' ) {
        return;
    }
    update_post_meta($post_ID, '_yoast_wpseo_sitemap-include', 'always' );
}
add_action(  'save_post',  'on_jobs_publish', 10, 2 );

そしてもう1つ将来のために助言します。 insertメソッドを使用しているときのようにwpdbクラスを使用するときは、絶対テーブル名を使用しないで、代わりに接頭部を$wpdb->prefixプロパティーに置き換えてください。はるかに安全です。たとえば、あなたのコードでは:

   global $wpdb;
   $wpdb->insert( 
       $wpdb->prefix.'_postmeta',
   //Rest of the code
1
cybmeta

私はあなたが手動でwpdbやpost metaを更新するべきではないと思うが、プラグインで正しい設定を探す。

Cptの作成時に'public' => trueが設定されていないため、Yoast Seoがカスタム投稿タイプを表示できないのではないでしょうか。

0
brobken