web-dev-qa-db-ja.com

ユーザーが自分の投稿(広告)を下書きにしてから承認を必要とせずに再度公開できるようにする方法

私はWordPressをディレクトリサイトとして使っています。そこではユーザーが投稿を投稿でき、それが彼らの広告/リストになります。ユーザーには、カスタムのワードプレスロールが割り当てられています。

投稿は管理者によって一度承認され、公開される必要があります、そしてそれから彼らは彼らが適切と思うように自由に自分の投稿を更新することができます。カスタムロールには公開機能を割り当てていないので、現時点ではこれでうまくいきます。

ただし、必要に応じてユーザーが自分の投稿をオフライン(おそらくドラフト)にして、いつでも公開できるようにする機能も必要です。現在、投稿を「ドラフト」にしたときに、再度公開するにはレビューのために送信する必要があります。これは理想的ではありません。

承認を必要とせずに、投稿をpublishedからdraftに変更してから再びdraftからpublishedに戻すことができるように、これを回避する方法はありますか?

それとも、私は彼らに最初に公開機能を与えますが、彼らの最初の投稿が承認されることを要求するプラグインがありますか? (彼らはとにかく1ポストのみ許可されています)。

投稿が公開されるかどうかを制御するチェックボックス付きのカスタムメタボックスについてはどうですか。残念ながら、このようなif機能でどこから始めればよいのかわかりません。私は他のメタボックスにもWPALchemyを使っています。

1
Andrew

その場で能力を割り当てるというクリスの提案のおかげで、私は他の誰かを助けるかもしれない何かを働かせることができました。もっと良い方法があるかもしれませんが、これは私の状況ではうまくいきます。

私はカスタム投稿タイプlistingで作業しているので、マッピングされたケーパビリティpublish_listingsをユーザーに割り当てる必要がありましたが、承認された後に限られます。私がこれを行うことを考えることができる最もよい方法は管理者だけが見ることができるカスタム投稿スクリーンに「管理者専用」メタボックスを含めることでした。これはWPAlchemyの助けを借りて行われ、それはoutput_filterです。

管理者だけが見ることができるメタボックスで、私は簡単なチェックボックスを追加しました。チェックすると、投稿が更新され、現在の投稿の作者にpublish_listings機能が追加されます。一種のディレクトリサイトなので、私の場合は著者1人につき1件の投稿しか許可していないので、これはかなりうまくいきます。チェックを外して更新すると、機能は削除されます。そのため、ユースケースは次のようになります。

  1. ユーザーが承認のために投稿を送信します
  2. 管理者が投稿を確認し、チェックボックスをオンにして、初めて投稿を公開します
  3. ユーザーは投稿を下書きにして再度公開することを含め、自由に投稿を自由に更新できます。

私が述べたように、私はメタボックスの重い処理にWPAlchemyを使っているので、投稿が更新されたときにsave_filterを使って機能を追加することができました。

function save_admin_only( $meta, $post_id ) {
global $post;

//get the author ID of the post we're on
$author_id = $post->post_author;
$id = get_the_author_meta( 'ID' , $author_id );
$user = new WP_User( $id ); //retrieves the user, based on their ID specified above for user with WP_User class

    if($meta['_can_publish'] == 'yes') {    
        $user->add_cap( 'publish_listings' ); //assign capability to this user if checkbox is ticked
    }
    else { $user->remove_cap( 'publish_listings' ); } //otherwise remove the capability so they can not publish

return $meta;
}

カスタム投稿タイプをチェックする必要がある場合(複数ある場合)、次のコードでラップすることができます。

if ( 'other_post_type' == get_post_type() ) {
    ...
}

これは、まったく新しい役割を作成するのではなく、単にユーザーにいくつかの機能を付与する必要がない他のシナリオでは非常に役立つ可能性があるようです。誰もが上記のことを改善することができるならば、してください。

0
Andrew

私は最近、まったく同じ問題を扱っていました。私はそれを解決しなかった、そして我々は人々が彼らのリストのために比較的大きな合計を払わなければならなかったので彼らが悪いものを投稿しないために十分に刺激されるであろうと決めた。さらに、それぞれを手動で承認するのは面倒です - 人々は結果を得るために一日待つのを嫌います。

そのため、最初からdirectory_memberユーザーレベルにpublish_postsおよびedit_published_postsの機能を付与しました。投稿が公開される前に、支払いプロセスを経なければなりません。支払いが済んだら、投稿を使って必要なことをすべて実行できます。

しかし、私はあなたの質問を見ている(まれな)脳波を持っていました。私が間違ったところはdirectory_memberdirectory_memberではなくdirectory_member_approvedレベルが1つしかないことだと思います。後者はedit_published_posts機能を持ちます。前者はしません。管理者が初めて投稿を公開したときにユーザーを登録するのは比較的簡単です。

もう1つの可能性は、ユーザーのメタフィールドに基づいて、edit_published_postsまたはどこかでadmin_init機能をオンザフライで割り当てることです。しかし、どういうわけか私は2つの明示的なレベルを持つという考えがより良いと思います。

あなたがしたことを教えてください。

2
Chris Carson