web-dev-qa-db-ja.com

Wp_postmetaテーブル内の1つの投稿に同じ名前の複数のpostmeta

私の投稿には_paymentという隠し投稿メタがあります。私がワードプレスのテーブルを調べていたとき、私は同じ投稿のために同じ名前を持つこの投稿メタが数十あることに気づいた!これはデータベースの写真です: Multiple postmeta for one post

これを引き起こすために間違ったコードを書くことはないと思います、私はただフィールドを追加して更新しました、しかしそれは同じmeta_idで同じフィールドを更新するべきです、同じ投稿に対して異なるmeta_idで新しいものを作成しません。

それでも私は知りません、多分それは普通のワードプレスのことですか?または私は間違っています...

これは私がこのフィールドを変更するために使っているコードです:

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

そして、このコードは、投稿が期限切れになるとcronジョブを実行します。

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は、投稿が更新されたときだけではなく、投稿が更新されたときに実行されます。そのため、投稿が保存されるたびにpayment_meta()関数が実行され、その関数でadd_post_meta()を使用しているため、投稿が保存されるたびに新しいメタエントリが作成されます。

値がまだ設定されていない場合はadd_post_meta()を使用する代わりにupdate_post_meta()を使用する代わりにメタを作成しますが、既に存在する場合は新しい値を追加するのではなく既存の値を更新します。

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