web-dev-qa-db-fra.com

Postmeta multiple avec le même nom pour un post dans la table wp_postmeta

J'ai une méta de publication masquée appelée _payment pour mes publications. Quand j'ai regardé dans les tables de la wordpress, j'ai remarqué qu'il y a des dizaines de ce post meta avec le même nom pour le même post! Voici une photo de la base de données: Multiple postmeta for one post

Je ne pense pas avoir écrit un code erroné à cause de cela, je viens d'ajouter et de mettre à jour le champ, mais il devrait mettre à jour le même champ avec le même meta_id, sans créer un nouveau avec un meta_id différent pour le même message.

Mais toujours je ne sais pas, peut-être que c'est une chose wordpress normale? Ou je me trompe ...

Voici les codes que j'utilise pour modifier ce champ:

function payment_meta($post_ID)
{
    $user_id = get_post_field( 'post_author', $post_ID );
    $user_role = 'editor'; 
    $post_type = 'portfolio'; 
    if( get_post_type( $post_ID ) == $post_type ) {
        if ( get_post_meta($post_ID, '_payment', true) != '1' && !user_can( $user_id, $user_role )) {
            add_post_meta($post_ID, '_payment', '0');
        }
        else if ( get_post_meta($post_ID, '_payment', true) == '' && user_can( $user_id, $user_role )) {
            add_post_meta($post_ID, '_payment', '1');
        }
    }
}

add_action('wp_insert_post', 'payment_meta', 11, 1);

Et ce code, cela exécute un travail cron lorsque le post expire:

function unpublish_post($post_id)
{
    wp_update_post(array(
        'ID' => $post_id,
        'post_status' => 'pending'
    ));

    update_post_meta($post_id, '_payment', '0');
}

add_action('expiration_date', 'unpublish_post', 11, 1);
1
Amirition

wp_insert_post s'exécute chaque fois qu'une publication est mise à jour, pas seulement lorsqu'elle est enregistrée pour la première fois. Donc, votre fonction payment_meta() est exécutée à chaque fois qu'une publication est enregistrée, et puisque vous utilisez add_post_meta() dans cette fonction, une nouvelle entrée de méta est créée chaque fois que la publication est enregistrée.

Au lieu d'utiliser add_post_meta(), limitez l'utilisation de update_post_meta() si une valeur n'est pas déjà définie, cela créera toujours la méta, mais si elle existe déjà, elle mettra à jour la valeur existante plutôt que d'en ajouter une nouvelle:

function payment_meta($post_ID)
{
    $user_id = get_post_field( 'post_author', $post_ID );
    $user_role = 'editor'; 
    $post_type = 'portfolio'; 
    if( get_post_type( $post_ID ) == $post_type ) {
        if ( get_post_meta($post_ID, '_payment', true) != '1' && !user_can( $user_id, $user_role )) {
            update_post_meta($post_ID, '_payment', '0');
        }
        else if ( get_post_meta($post_ID, '_payment', true) == '' && user_can( $user_id, $user_role )) {
            update_post_meta($post_ID, '_payment', '1');
        }
    }
}

add_action('wp_insert_post', 'payment_meta', 11, 1);
3
Jacob Peattie