0

wp_update_post を使用して、タイトルとタグをフロントエンドからプログラムで投稿に追加しています。プロセス中のカスタム フィールドで、頭を悩ませる問題に遭遇しています。投稿が最初に作成されたときに作成され、入力された 2 つのカスタム フィールドのうちの 1 つは値が削除されていますが、もう 1 つは完全に問題ありません。

これは、最初に投稿を作成するために使用するコードの一部です。

// Set the post ID so that we know the post was created successfully
$post_id = wp_insert_post(
    array(
        'comment_status'=>  'closed',
        'ping_status'   =>  'closed',
        'post_author'   =>  $author_id,
        'post_name'     =>  $slug,
        'post_status'   =>  'publish',
        'post_type'     =>  'custom'
    )
);

// If the post was created properly
if($post_id) {

    // Add meta/custom field data to post
    add_post_meta($post_id, 'custom_random_id', $randomId);
    add_post_meta($post_id, 'viewcount', '1');

次に、これはタイトルとタグを更新するために使用するコードです。

// Continue if untampered
if($new_hashed_value == $_POST['hash']) {

    $updatePost = array();
    $updatePost['ID'] = $post_id;
    $updatePost['post_title'] = $title;
    $updatePost['tags_input'] = $tags;

    if(wp_update_post($updatePost)) {

        totallyUnrelatedStuff();
    }

wp_update_post が値を削除する可能性があることは他の投稿から理解していますが、この場合、カスタム フィールド ' custom_random_id ' は常にそのままで、' viewcount ' は常にその値が削除されます。

次のように変更してみました。

if(wp_update_post($updatePost)) {

        update_post_meta($post_id, 'viewcount', '1');
    }

あるいは:

if(wp_update_post($updatePost)) {
        delete_post_meta($post_id, 'viewcount');                                    
        add_post_meta($post_id, 'viewcount', '1');
    }

しかし、viewcountフィールドの値は引き続き消去されます。

さらに、私にもう1本レンチを投げつけるだけで、

if(wp_update_post($updatePost)) {
        delete_post_meta($post_id, 'viewcount');                                    
        add_post_meta($post_id, 'new_field', 'new_value');
    }

完璧に動作します。

誰が何が起こっているのか知っていますか?

ありがとう!

4

1 に答える 1

3

私も似たようなことがありました。

wp_update_postアクションを呼び出しますsave_postsave_postカスタム投稿タイプを使用しているため、メタデータを保存するためにアクションで実行するカスタム関数がある可能性があります。

問題は、wp_update_postメタデータを保存するためにカスタム関数を呼び出すときに、探しているデータが見つからないため、これらの値を空白に設定することです (通常は$_POST)。

アクション関数を実行する必要があるかどうかを確認するために、いくつかの追加チェックを追加する必要があります。save_postある意味で、それが Wordpress の編集画面から呼び出されているかどうか、またはフロントエンド フォームから呼び出されているかどうかをテストします。

私の場合、これで問題が解決しました:

function save_metadata($postid) {   
    global $post;  
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return false;
    if ( !current_user_can( 'edit_page', $post->ID ) ) return false;
    if ( empty($post->ID) || get_post_type( $post->ID ) != 'post_type_here' ) return false;
    if ( !is_admin() ) return false;

    updateMyMetas();
}
于 2014-01-10T00:54:04.723 に答える