特定のカスタム投稿タイプ( '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をこの関数に渡してメタ情報を公開された投稿に関連付ける方法を教えてください。
コード内に$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
私はあなたが手動でwpdbやpost metaを更新するべきではないと思うが、プラグインで正しい設定を探す。
Cptの作成時に'public' => true
が設定されていないため、Yoast Seoがカスタム投稿タイプを表示できないのではないでしょうか。