web-dev-qa-db-ja.com

存在しないブログページは404にリダイレクトされません

Blogというページがあります。 Settings -> Readingでは、Blog pagePosts pageに設定しました。メニューのBlogリンクをクリックすると、投稿が正しくロードされ、ページ付けが機能します。すべての情報はhome.phpテンプレートから来ています。

私はmax_num_pages and paged paramsを見ているページを生成する私自身のページネーションコードを使っています。つまり、正しいリンクを持つ正しいページ数が生成されます。

しかし、存在しないブログページをテストしたところ。例えば、5つのページが存在し、私はそれが404にリダイレクトされないblog/page/6をタイプします、その代わりにそれはメインのif(have_posts())のelseステートメントにフォールバックするようです。

同じページ区切りコードを使用するカテゴリページ付きページをテストしました。それらは正しく動作します。タイプcategory/<category_name>/page/2の存在しないカテゴリページは404テンプレートにリダイレクトされます。

存在しないメインブログの「ページ付きページ」が404にリダイレクトされない理由は何も考えられません。

私はどんなヒントや助けにも大いに感謝するでしょう。

ありがとう、ダーシャ

2
dashaluna

XXXthページに表示されるコンテンツが既に存在するまで表示されないことに気付かないので、これはカスタムクエリ(あなたが自分でページングされた値を入力する)またはindex.phpを使用するときのページネーションに対するデフォルトのWordpress動作です。テンプレートをロードしてから、WP_Queryを実行しようとします。

$ pagedが設定されていて結果が見つからないかどうかを判断するロジックを追加して試してみると、404をスローすることができます。これは次のようになります。

header("HTTP/1.0 404 Not Found");
$wp_query->set_404();
require TEMPLATEPATH.'/404.php';
exit;
1
Dave Hunt

これは私がすべてのワードプレスサイトの私のfunctions.phpで通常使うものです(私は知っています、私はプラグインとしてそれをコーディングするべきです...)

/**
 * @author daniele raimondi W3B snc
 * @version 0.4
 * @abstract This workaround fixes a problem with page pagination, where you can request
 * n paginated part of a (non-paginated)page from 2 to 2147483647 (max 32 signed int value)
 * and you will never get a 404 error. WP returns instead the page itself  if it's a not-paginated page, 
 * or the first page if you request n-paginated pages, from n+1 on.
 */

function fix_missing_404_on_paginated_page() {
    global $wp_query,$page,$paged;

    if (!isset($page)) $page = get_query_var('page');
    if (!isset($paged)) $paged = get_query_var('paged');
    if (is_page() || is_single()) {
        $realpagescount = count( explode( '<!--nextpage-->', $wp_query->post->post_content ) );

        if ( (isset($page) && isset($realpagescount) && $page >= $realpagescount) || (is_paged() && isset($paged) && $paged >=0 ) ){
        //wp_redirect( home_url() );
            nocache_headers();
            status_header( '404' );
            $wp_query->is_404=true;
            $wp_query->is_single=false;
            $wp_query->is_singular=false;
            $wp_query->post_count=0;
            $wp_query->page=0;
            $wp_query->query['page']='';
            $wp_query->query['posts']=array();
            $wp_query->query['post']=array();
            $wp_query->posts=array();
            $wp_query->post=array();
            $wp_query->queried_object=array();
            $wp_query->queried_object_id=0;
            locate_template('404.php', true);
            exit;
        }
    }
}
add_action('template_redirect', 'fix_missing_404_on_paginated_page');
3

私は最近、マルチサイトのインストールのページや投稿について同様のことをしました。残念ながら、 を考え出していません / WordPressは404テンプレートを呼び出さないことがありましたが、回避策を構築します。

functions.phpで私は小さなヘルパー関数を作りました:

/**
 * Helper for cases where the 404 template is not loaded correctly.
 *
 * @return bool
 */
function t5_force_404()
{
    if ( have_posts() )
    {
        return FALSE;
    }

    header( 'HTTP/1.0 404 Not Found' );
    locate_template( '404.php', TRUE, TRUE );
    $GLOBALS['wp_query']->is_404 = TRUE;
    return TRUE;
}

そしてsingle.phppage.phpの上に、私はこれを次のように呼びました:

if ( t5_force_404() ) {
    return; // stop any further processing
}

// everything is fine, go on.
get_header();

それで…これで問題は解決しますが、なぜそれが起こるのか私にはまだわかりません。

2
fuxia