web-dev-qa-db-ja.com

コードを介してプログレッシブに投稿の1つのリビジョンを元に戻す?

私は簡単な質問を考えたでしょうが、私はWordPress APIでこれをするための関数を見つけることができません。

ユーザーが投稿を更新したらすぐに、以前のリビジョンに戻したいだけです。これにより、管理者/編集者は最新の非ライブリビジョンを確認しながら、古いリビジョンはライブのままであるように見えます。編集者/管理者はそれに満足したら投稿を最新のリビジョンに切り替えます。

5
AdamJones

それで私は前のものが生きている間かなり編集者/管理者に記事をレビューさせることに解決策を得ることに成功しましたが、かなり複雑ですがうまくいきます。

私がした重要なことは私が待っていると呼ぶ新しい投稿ステータスを作成することでした。管理者には、「承認待ちの変更」として表示されます。

// Define new awaiting status
function my_custom_post_status(){
register_post_status( 'awaiting', array(
    'label'                     => _x( 'Changes Awaiting Approval', 'custom-post-type' ),
    'public'                    => true,
    'exclude_from_search'       => false,
    'show_in_admin_all_list'    => true,
    'show_in_admin_status_list' => true,
    'label_count'               => _n_noop( 'Changes Awaiting Approval <span class="count">(%s)</span>', 'Changes Awaiting Approval <span class="count">(%s)</span>' ),
   ) );
 }
add_action( 'init', 'my_custom_post_status' );

非常に重要なのは、これがパブリックステータスの種類です。

それから、私は特定のユーザーによる更新を強制して、更新ポストプロセスの最後にフックを介してポストステータスをこの新しいステータスに変更します...

function published_to_pending( $post_id ) {
    global $post, $current_user, $wp_meta_boxes ;

    if ( !is_object( $post ) )
        $post = get_post( $post_id );
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;
    // check for specific user that needs this publish to pending. otherwise exit
    if (get_current_user_role()!="custom-user-role"){
        return;
    }
    if ( $post->post_status=="publish" ) {
        global $wpdb;
        $result = $wpdb->update(
            $wpdb->posts,
            array( 'post_status' => "awaiting" ),
            array( 'ID' => $post_id )
        );
    }
}
add_action( 'post_updated', 'published_to_pending', 13, 2 );

function get_current_user_role() {
    global $wp_roles;
    $current_user = wp_get_current_user();
    $roles = $current_user->roles;
    $role = array_shift($roles);

return $role;
}

"save_post"フックを使って投稿ステータスを更新する非常に一般的な方法は私には良くないことに注意してください。これは、このフックを使用しても投稿に正しく接続されたメタデータが保存されないため、AdvancedCustomFieldプロパティが壊れたためです。

最後に私のエントリを見るためのsingle.phpページのフロントエンドで、私は投稿のステータスをチェックし、それが== "awaiting"の場合は、投稿の前のリビジョンを取得するために手動$ wpdbクエリを実行します。その関連メタプロパティ。これが他の人に役立つことを願っています。

3
AdamJones

私はあなたが望むことをするのは簡単ではないし、編集者があるリビジョンを公開している間に自動的に見るように強制する(プラグインがあるかもしれない)が、ここにリビジョンを識別し特定のものに戻すためのスタンドアロンコードがある:

# get all revisions for post ID 1 in an array (keys = ID, val = full WP_Post object)
$revisions = wp_get_post_revisions(1);
# they're returned in reverse order (most recent first), so previous is 2nd array element
wp_restore_post_revision($revisions[1]->ID);

注:投稿が最初に公開されたときには1つのリビジョンしかありません(ユーザーがドラフトを保存した場合を除く)。

ドキュメント: wp_restore_post_revision

2
William Turrell