web-dev-qa-db-ja.com

RWメタボックス、問題設定役職

私は RW_Meta_Box プラグインを Rilwis で使っています。

私はCPTを使用していて、カスタムメタボックスを追加し、titleeditorを削除しました。

しかし、私はまだいくつかの明白な理由でタイトルを設定したいです。

私はCPTとメタボックスを作成しました、そしてall postsフックを使っているcustom columnページを含めてすべてが完璧に働きました。

メタボックスのいずれかのフィールドに投稿のタイトルを設定しようとしたらすぐに、希望する結果が得られませんでした。このQ&Aサイトを検索して選択した解決策を試してみました。

最初に試しました:

解決策1:

add_action('submitpost_box', 'hidden_type_title');

function hidden_type_title() {
    global $current_user, $post, $post_type;
    global $prefix;
    $md = rwmb_meta($prefix . 'name', array('type' => 'text'), $post->ID);
    if ($post->post_type == 'MY_CPT_NAME') {
    ?>
    <input type="hidden" name="post_title" value="<?php echo esc_attr(htmlspecialchars($md)); ?>" id="title" />
    <?php
    } else {
    return;
    }
}

上記のコードは問題なく動作しますが、検出できない問題があります。つまり、投稿のタイトルを設定するには、投稿を2回更新する必要があります。

そのため、私はsave_postフックを試してみました。

解決策2:

add_action('save_post', 'post_updated');

function post_updated($post_id) {
    global $current_user, $post;
    if ($post->post_type != 'MY_CPT_NAME') {
    return;
    }

    global $prefix;
    $md = rwmb_meta($prefix . 'name', array('type' => 'text'), $post_id);
    // verify post is not a revision & not an autosave
    if (!wp_is_post_revision($post_id) && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) {
    // set the new post title
    $post->ID = $post_id;
    $post->post_title = $md;

    // update the post, removing the action to prevent an infinite loop
    remove_action('save_post', 'post_updated');
    wp_update_post($post);
    add_action('save_post', 'post_updated');
    return;
    }
}

今、私はもっと悪い状況にあります。投稿のタイトルは即座に設定されますが、私のメタボックスデータはどういうわけか保存されていません。

最初の解決策で何が問題になる可能性がありますか?

1
Junaid Qadir

これがRilwisのアクションフックを利用した解決策です…それであなたはあなた自身を追加する必要なしに彼の一回限りのチェックから利益を得ることができます。

add_action('rwmb_after_save_post', 'post_updated');

function post_updated($post_id) {

    // verify post is not a revision & not an autosave
    if (!wp_is_post_revision($post_id) && !(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)) {

    global $prefix;
    $prefix . 'name';

    // check that the custom field is being POSTED 

    if( isset( $_POST[$prefix . 'name'] ) ){    
        $my_post = array();
        $my_post['ID'] = $post_id;
        $my_post['post_title'] = sanitize_title( $_POST[$prefix . 'name'] );

        // Update the post into the database
        wp_update_post( $my_post );   

        }

    }
}

この関数をのみ特定のメタボックスに対して実行するように制限するには、代わりにこのadd_actionを使用できます。

add_action("rwmb_{$meta_box['id']}_after_save_post", 'post_updated');

メタボックスの定義を見なくても、IDを何に変更すればよいのかわかりません。

NB:未検証ですが、近いと思います。その機能がどのように機能するかについては、コーデックスの wp_update_post() を参照してください。

2
helgatheviking