質問: WordPressでカスタム投稿タイプのページ別にコメントされたタイミングでそれぞれのサンクスページへリダイレクトしたい。 functions.phpに ``` function redirect_after_comment() { wp_safe_redirect( home_url( '/?p=128' ) ); exit(); } add_filter( 'comment_post_redirect', 'redirect_after_comment' ); ``` を記述し動作した。 次は各コメントページから各サンクスページへリダイレクトさせる為、 ページ判定の条件分岐を追記。 コメントページ1→サンクスページ1 コメントページ2→サンクスページ2 コメントページ3→サンクスページ3 それぞれのコメントページへコメントしたタイミングでサンクスページへリダイレクトさせたい。 ``` function redirect_after_comment() { if ( is_single('12') ) { wp_safe_redirect( home_url( '/?p=128' ) ); exit(); } } add_filter( 'comment_post_redirect', 'redirect_after_comment' ); ``` しかし、コメントしても/wp-comments-post.phpで止まって白いページのまま。 コメント自体は投稿されているが、リダイレクトがうまくいってないようです。 ``` if ( is_single('12') ) { wp_safe_redirect( home_url( '/?p=128' ) ); exit(); } ``` は、テストでheader.phpの一番上に記述し問題なくリダイレクトした。 どこが違うのでしょうか? 分かる方が居られましたら、どうか回答お願いします。
回答: コメント送信後に実行されるcomment_postアクションフックを利用する方法もあります。このフックには第一引数にコメントIDが渡されるので、get_comment(コメントID)でコメントオブジェクトを取得し、コメントオブジェクトに入っている投稿IDでどの投稿に対するコメントが送信されたのかを判断できます。 リダイレクト先をカスタムフィールドで登録するようにしておけば、プログラム内に遷移先URLをハードコーディングしなくて済むので、保守性が高まるでしょう。 ``` add_action('comment_post', function($comment_ID, $comment_approved, $commentdata) { // ページIDを取得 $comment = get_comment($comment_ID); $post_id = $comment->comment_post_ID; // カスタムフィールドに登録されたリダイレクト先URLを取得 //(フィールド名がcomment_redirectの場合) $redirect_to = get_post_meta($post_id, 'comment_redirect', true); // リダイレクト先URLが登録されていれば遷移させる if ($redirect_to) { wp_safe_redirect($redirect_to); exit; } }, 10, 3); ```