Un de mes clients demande que toutes les publications d'un certain type de publication personnalisée (appelées "tâches personnalisées") soient configurées pour être automatiquement incluses dans le plan du site dans le plug-in Yoast SEO.
J'ai constaté que pour ce faire, le message a besoin d'une clé méta '_yoast_wpseo_sitemap-include' avec la valeur 'toujours'. J'ai donc essayé d'appeler une fonction en utilisant le hook {status} _ {post_type} comme suit:
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 );
Cela fonctionne presque. Il ajoute les méta-informations à la base de données, mais le post_id est toujours défini sur 0. J'ai essayé de passer et d'utiliser les variables $ post et $ ID également sans succès. Avez-vous une idée de la façon dont je peux transmettre l'identifiant de la publication personnalisée à cette fonction afin que les méta-informations soient associées à la publication publiée?
Vous utilisez une variable $post->ID
non définie car il n'y a pas de référence à un objet $post
dans votre code; utilisez plutôt la variable $post_ID
récupérée dans la fonction:
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 );
De plus, au lieu de travailler avec le global $wp_query
et d’exécuter la méthode d’insertion, je pense qu’il serait préférable d’utiliser la fonction 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 );
Notez que l'action publish_{post-type}
est déclenchée lorsque la publication change le statut de toute valeur en "publier". Cela signifie que si le message est déjà publié et que vous essayez de le mettre à jour, cette fonction ne sera pas exécutée. Si vous avez besoin de l'exécuter sans prendre en compte le statut de la publication, utilisez le hook 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 );
Et encore un conseil pour l’avenir. Lorsque vous utilisez la classe wpdb
, comme vous utilisez la méthode insert, n'utilisez jamais le nom complet de la table, mais remplacez le préfixe par la propriété $wpdb->prefix
. C'est beaucoup plus sûr. Par exemple, dans votre code:
global $wpdb;
$wpdb->insert(
$wpdb->prefix.'_postmeta',
//Rest of the code
Je ne pense pas que vous devriez mettre à jour manuellement la méta-publication wpdb ou post, mais rechercher les bons paramètres dans le plug-in.
Peut-être que Yoast Seo ne peut pas voir votre type de message personnalisé parce que 'public' => true
n'est pas défini lors de la création de cpt?