web-dev-qa-db-ja.com

既存の投稿ステータスを電子メールで「保留中」から「公開」に変更することはできますか?

私はカスタムフォームプラグインを使用するWebサイトを構築しています、そしてプラグインは私にフォームからのデータを使用して投稿(保留中または公開)を作成する能力を与えてくれます。フォームを送信すると、レビュー待ちの投稿の電子メール通知を特定の人のリストに送信して、ワンクリックで承認(投稿ステータスを「公開」に更新)できるようにします。何か案は?

現在のところ、私の回避策は、投稿に使用しているメールアドレスにメールを転送することですが、それは不格好な解決策です。

1
LegMuscleCramp

ステップ1 - カスタムクエリVarを登録する

カスタムクエリvarを追加することで、WPにそれを認識させるので、リクエストで使用できます。

function wpse_add_query_vars( $vars ) {
    $vars[] = 'wpse_set_to_publish';
    return $vars;
}
add_filter( 'query_vars', 'wpse_add_query_vars' );

ステップ2 - 要求を傍受する

今度は新しいカスタムクエリvarを探すためにparse_requestにフックします。これはあなたがそれを処理するところであり、それはあなたが望むのと同じくらい複雑または単純になることがあります。たとえば、セキュリティのために、postmetaまたはtransientとして格納されているトークンの存在を確認することができます。しかし、それは最も基本的なレベルでは:

function wpse_sniff_request( $query ) {
    if ( ! is_admin() && isset( $query->query_vars['wpse_set_to_publish'] ) ) {
        $post_vars = array(
            'ID' => $query->query_vars['wpse_set_to_publish'],
            'post_status' => 'publish'
        );
        wp_update_post( $post_vars );
    }
}
add_action( 'parse_request', 'wpse_sniff_request' );

注:ステップ1を飛ばしてinitフックでこのステップを実行し、代わりに$_GET['wpse_set_to_publish']をインターセプトすることもできますが、これは厳密には "Wordpressのやり方"ではありません

ステップ3 - 電子メールで承認リンクを提供する

最後に、あなたが出て行く電子メールを生成していると仮定すると、これらの行に沿って何かを含むリンクを含めることができます。

echo add_query_arg( array( 'wpse_set_to_publish' => $post_id ), site_url() );

注:おそらく、wp_insert_post()の戻り値から$post_idを取得することになります。

その後、そのリンクをクリックすると、http://yourwebsite.com/?wpse_set_to_publish=123に移動します。これにより、投稿のステータスが123に更新され、公開のステータスになります。

残念ながら、今これを完全にテストする時間はありませんが、これで正しい方向に進むことができます。繰り返しますが、これは最も基本的な実装であり、常にセキュリティ、アクセス許可などを考慮する必要があります。これはより便利かもしれませんが、理論的にははるかに安全です。 get_edit_post_link() へのリンクを提供すると、ユーザーは強制的にログインすることになります(まだログインしていない場合)。 。

1
brianjohnhanna