web-dev-qa-db-ja.com

フォーム送信後にwp_redirectが機能しない

投稿を挿入した後にこのリダイレクトを使用しています。機能していません。フォームが表示されているページを更新するだけです。私は$ pidが投稿IDを取得しているのを知っているので問題は何ですか?これがフォーム送信を処理するための私のphpコードの最後です。

$pid = wp_insert_post($new_post);

update_post_meta($pid,'domain',$domain);
update_post_meta($pid,'keywords',$keywords);

wp_redirect( get_permalink($pid) );
exit();

完全なコードの ペーストビン です。

より良いHTTPリダイレクトを使用すると、その出力はそのままで、Wordのhereを正しい新しく公開された投稿にリンクします。

302 Found
The document has moved here.
5
Anagio

wp_redirectbeforeコンテンツのみがブラウザに送信されます。 PHPのデバッグを有効にした場合、最初の行にget_header()のための "headers already sent"エラーが表示されるでしょう。

テンプレートでフォームを処理するのではなく、 wp_loadedのように、以前のaction をフックし、リダイレクトする場合はクエリをいくつかdbに保存することができます。

_ edit _ 、example-

add_action( 'wp_loaded', 'wpa76991_process_form' );
function wpa76991_process_form(){
    if( isset( $_POST['my_form_widget'] ) ):
        // process form, and then
        wp_redirect( get_permalink( $pid ) );
        exit();
    endif;
}

アクションを使用すると、コードをテンプレートから除外したり、テンプレートから分離したりできます。これをショートコードと組み合わせてフォームを出力し、処理/出力の間の状態を保存するためにすべてをクラスでラップします。フロントエンドのテンプレートに触れることなくすべてを実行できます。

11
Milo

そのコードの最後にget_header();を移動すると、問題は解決します。あなたのコードはヘッダが送信される前に実行され、リダイレクトは機能するでしょう。

// ...
wp_redirect( get_permalink($pid) );
exit();
//insert taxonomies
} 
get_header(); ?>

私はあなたが投稿したものの下のページにもっとコードがあると思いますか?そうでない場合、私はget_header()の必要性をまったく見ません。

Miloが示唆しているように私がフックを使用することで私が見ることができる唯一の利点はあなたが十分早いフックを選ぶならあなたがいくらかのオーバーヘッドを避けることができるかもしれないということです。あなたは処理のほんの一瞬を削ることができます。

4
s_ha_dum