web-dev-qa-db-ja.com

プログラム的に404を生成する方法

このようなものを機能させるにはどうすればよいですか。

// in a plugin / theme:
// This imaginary function will make WordPress think that the 
// current request is a 404. 
// Ideally this function could be ran anywhere, but realistically it
// will probably have to be before the template_redirect hook runs.
generate_404_somehow();

// later...
add_action('template_redirect', function() {
    // should be "true"
    var_dump(is_404());
});

基本的には特定の条件下では、ロードしようとしているテンプレート(ページやアーカイブなど)の代わりに404テンプレート(必要に応じて後で追加できる)を表示するようにWordPressに指示します。

存在しないページに302リダイレクトを実行することしかできないことを私は知っていますが、それは非常に面倒です。手動で404 HTTPヘッダーを送信することもできますが、その場合はWPのNice 404ページを使用できません(is_404()にフックするものが適切なタイミングで起動される必要があります)。

6
dave1010
function generate_404_somehow() {
   global $wp_query;
   $wp_query->is_404 = true;
}
add_action('wp','generate_404_somehow');

もちろん、それはあなた全員のページを404テンプレートに送るでしょう。これが発火すべきかどうかという条件が何であるか私は知らない。

またはもっと用心深くするために(コメント参照)...

function generate_404_somehow() {
   global $wp_query;
   $wp_query->set_404();
}
add_action('wp','generate_404_somehow');
6
s_ha_dum

S_ha_dumの回答によるもう1つは、HTTPヘッダーステータスを404 Not Foundに設定しません。これを行うには、status_header( 404 )を関数に追加します。

function generate_404_somehow() {
    global $wp_query;
    $wp_query->set_404();
    status_header( 404 );
}
add_action('wp','generate_404_somehow');
1
Erik Joling

うまくいくようです:

global $wp_query;
$wp_query->set_404();
$wp_query->max_num_pages = 0; // stop theme from showing Next/Prev links

これはHTTPヘッダを設定し、正しいテンプレートをロードするようです(is_404()が真)。

0
dave1010