質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

【WordPress】公開済みの記事を更新した際にレビュー待ちのステータスに変更

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 988

Samurai_Tiger

score 41

前提・実現したいこと

WordPressでサイトを構築しており、ライターが記事を更新した際に、
記事のステータスを「公開」から「レビュー待ち」に変更したいと考えています。

発生している問題

以下のようなコードをfunctions.phpに記載したのですが、
前段if文の記事が公開済みかどうかを判定する部分が機能しておらず、
force_update_post()が動作しない状況となっております。

初歩的な質問となり恐縮ですが、どうぞよろしくお願いいたします。

該当のソースコード

    $post_id = get_the_ID();
    if ( get_post_status( $post_id ) == 'publish' ) {
        function force_update_post() {
            remove_action('save_post_custom_post', 'force_update_post');
            $args = array('post_status' => 'pending');
            wp_update_post($args);
            add_action('save_post_custom_post', 'force_update_post');
        }
            add_action('save_post_custom_post', 'force_update_post');
    }


参考ページ

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

この書き方は、何かを参考にされたのでしょうか?

このコードを実行した場合、$post_id は、取得できていますか?


functions.php を読み込んだ時点では、WordPress は初期化が完了していない状況なので、get_the_ID() で、投稿IDを取得することはできません。(おそらく false になると思います。)

投稿等を検索するのに利用する wp オプジェクトが使用できるのは、 wp フック以降になります。

通常は、save_post#無限ループ回避 の例のように save_post フックで呼び出される関数のなかで、投稿IDを利用してステータスを確認して、条件判断するほうが簡単だと思いますが...

どうしても、投稿ID をチェックしてから HOOK を登録したいということであれば、無駄が多いですが、全体を function で囲って、 wp フックで、実行されるようにしてください。

質問のコードの中は確認していませんが、こんな感じで、外側を function で囲って、add_action('wp', '外側の関数名'); を追加してください

functuon add_hook_188290() {
    $post_id = get_the_ID();
    if ( get_post_status( $post_id ) == 'publish' ) {
        function force_update_post() {
            remove_action('save_post_custom_post', 'force_update_post');
            $args = array('post_status' => 'pending');
            wp_update_post($args);
            add_action('save_post_custom_post', 'force_update_post');
        }
        add_action('save_post_custom_post', 'force_update_post');
    }
}
add_action('wp', 'add_hook_188290');

追記

そのまま、save_post フックで登録するならこんな感じでしょうか。(今回の例では、if 内の remove_action と add_action は、なくても問題なく動作すると思いますが、そのまま残しておきます。)

function force_update_post_188290( $post_id ) {
    if ( get_post_status( $post_id ) == 'publish' ) {
        remove_action( 'save_post', 'force_update_post_188290' );
        $args = array( 'ID' => $post_id, 'post_status' => 'pending' );
        wp_update_post( $args );
        add_action( 'save_post', 'force_update_post_188290' );
    }
}
add_action( 'save_post', 'force_update_post_188290' );

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 14:25

    大変ご丁寧なご回答ありがとうございます。
    追記にて記載いただいたコードを少し編集することで、期待通りに動作いたしました。

    キャンセル

+2

function force_update_post()の定義の中で
自分自身の呼び出しをremove_actionとかadd_actionするのってダメっぽい気がするし、
特定条件でしか関数が存在しないのもヘン。

add_action()する関数は、
常に見える(?)グローバルな関数であるべきなので、
function force_update_post() の中の処理で
改めてフラグなど条件を確認するようにするべきかと。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 14:08

    > 自分自身の呼び出しをremove_actionとかadd_actionするのってダメっぽい気がするし、

    WordPress で、save_post フック実行時の無限ループ回避策の一つです。

    いちおう、公式ドキュメントにも記載があります。

    [save_post 無限ループ回避]( https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/save_post#.E7.84.A1.E9.99.90.E3.83.AB.E3.83.BC.E3.83.97.E5.9B.9E.E9.81.BF )

    キャンセル

  • 2019/05/08 14:20

    ご指摘ありがとうございます。

    キャンセル

  • 2019/05/08 14:23

    こんなことしないと回避できない仕様をなんとかしてほしいというのはあるんですけどね... 代替案が思いつかない。

    キャンセル

  • 2019/05/08 14:26

    ご回答ありがとうございます。
    基本的な知識が不足しており、大変勉強になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る