web-dev-qa-db-fra.com

Ajouter une méta valeur au type de publication personnalisée lors de la publication

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?

1
MattR

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
1
cybmeta

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?

0
brobken