Добавить мета значение в пользовательский тип сообщения в публикации

У меня есть клиент, который запрашивает, чтобы все сообщения определенного пользовательского типа сообщений (называемые «настраиваемые задания») были автоматически установлены в файл Sitemap в плагине 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 ); 

Это почти работает. Он добавляет метаинформацию в БД, но post_id всегда имеет значение 0. Я пробовал передавать и использовать переменные $ post и $ ID, а также не повезло. Любая идея, как я могу передать идентификатор пользовательской почты в эту функцию, чтобы метаинформация была связана с опубликованной публикацией?

Solutions Collecting From Web of "Добавить мета значение в пользовательский тип сообщения в публикации"

Вы используете неопределенную переменную $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_{post-type} запускается, когда сообщение изменяет статус с любого значения на «publish». Это означает, что если сообщение уже опубликовано и вы пытаетесь его обновить, эта функция не будет выполнена. Если вам нужно выполнить его, не заботясь о статусе сообщения, используйте save_post action hook:

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

И еще один совет для будущего. Когда вы используете класс wpdb , как вы используете метод insert, никогда не используйте полное имя таблицы, вместо этого замените префикс $wpdb->prefix . Это намного безопаснее. Например, в вашем коде:

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

Я не думаю, что вы должны вручную обновить wpdb или мета-сообщение, но искать правильные настройки в подключаемом модуле.

Возможно, Yoast Seo не может видеть ваш пользовательский тип сообщения, потому что 'public' => true не задано, когда cpt создается?