4.4で壊れた<!-nextpage->でコンテンツを追加する


14

更新2016-01-21

私の側での現在のすべてのテストは、4.4.1の新規インストールで次の設定で行われています。 Plain permalinks Twentysixteen Theme No plugins activated

投稿に1ページしかない場合(つまり<!--nextpage-->、投稿に表示されない場合)、追加のページは正常に追加されます(複数の追加ページを追加する場合も¹)。

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

投稿に2つ以上のページがある場合、余分なページ404および正規のリダイレクトは投稿のページ1になります。

Welcome to WordPress. This is your first post. Edit or delete it, then start writing!

<!--nextpage-->

This is page 2

2番目のケースで$wp_query->queried_objectは、余分なページにアクセスすると空になります。これを確認するには、標準リダイレクトを無効にする必要がありますremove_filter('template_redirect', 'redirect_canonical');

次のコア修正の両方が、動作を変更することなく個別に一緒に試行されました:https : //core.trac.wordpress.org/ticket/35344#comment : 16

https://core.trac.wordpress.org/ticket/35344#comment:34

使いやすさのために、これは私が現在テストしているコードです:

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1";
    $post->post_content .= $content;
}

add_filter('content_pagination', 'custom_content_two', 10, 2);
function custom_content_two($pages, $post) {
    if ( in_the_loop() && 'post' === $post->post_type ) {
        $content = "This is the extra page v2";

        $pages[] = $content;
    }
    return $pages;
}

add_action('the_post', 'custom_content_three');
function custom_content_three() {
    global $multipage, $numpages, $pages;
    $content = "This is the extra page v3";

    $multipage = 1;
    $numpages++;
    $pages[] = $content;
}

¹これは、1ページの投稿で複数の追加ページをテストするために使用したコードです

add_action('template_redirect', 'custom_content_one');
function custom_content_one() {
    global $post;
    $content = "\n<!--nextpage-->\nThis is the extra page v1-1\n<!--nextpage-->\nThis is the extra page v1-2\n<!--nextpage-->\nThis is the extra page v1-3";
    $post->post_content .= $content;
}

元の質問

4.4より前では、次のように複数ページに追加ページを追加できました。

add_action('template_redirect', 'custom_content');
function custom_content() {
    global $post;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));
    $post->post_content .= $content;
}

get_option( 'custom_content')は次のようになります。

<!--nextpage-->
Hello World

4.4へのアップグレード以降、コードは機能していません。追加ページに移動すると404エラーがトリガーされ、redirect_canonicalはそれらを投稿のパーマリンクに送り返します。redirect_canonicalを無効にすると、追加のページが表示され、追加のコンテンツが表示されますが、404エラーが発生します。

次のような多くの回避策を試しましたが、いずれも404エラーを解決できませんでした。

add_action('the_post', 'custom_content');
function custom_content() {
    global $multipage, $numpages, $pages;
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $multipage = 1; // ensure post is considered multipage: needed for single page posts
    $numpages++; // increment number of pages
    $pages[] = $content;
}

また、4.4で追加された新しいcontent_paginationフィルターを活用してみました。

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $content = html_entity_decode(stripslashes(get_option('custom_content')));

    $pages[] = $content;
    return $pages;
}

この時点で、私はこの機能を復元する方法についてのアイデアがありません。どんな支援も歓迎します。


申し分なく、私はこれに更新を持っています、残念ながらそれはポジティブなものではありません。明らかに、エクストラページが2ページの場合、新規インストールで機能します。ただし、エクストラページが3ページ(またはそれ以上)の場合、破損します。/手首
ミランバー

1
バグを見つけた!!!!! うん!!!!。回答をすぐに更新します
Pieter Goosen

回答:


8

2016年1月21日更新19:35 SA時間-バグが見つかりました!!!!! うん!!!!!!

ついにバグを見つけました。あなたが最後の更新で述べたように、失敗にのみ発生し$post_contentている<!--nextpage-->内容でタグを。私はそれをテストし、<!--nextpage-->404 が返された後のページの後の他のページが確認され、そのページが最初のページにリダイレクトされることを確認しました。

これは、に起因するコードの次の行handle_404()に導入されたメソッドWPのクラスワードプレス4.4で

// check for paged content that exceeds the max number of pages
$next = '<!--nextpage-->';
if ( $p && false !== strpos( $p->post_content, $next ) && ! empty( $this->query_vars['page'] ) ) {
    $page = trim( $this->query_vars['page'], '/' );
    $success = (int) $page <= ( substr_count( $p->post_content, $next ) + 1 );
}

このコードは、<!--nextpage-->タグがで設定されるたびにpost_contentcontent_paginationフィルターを介してコンテンツの後に追加されるページにアクセスすると404を返します。404が設定されているため、redirect_canonical()追加されたページを最初のページにリダイレクトします

この問題に関するtracチケットを提出しました。こちらで確認できます。

執筆時点ではまだフィードバックはありませんでしたので、チケットのステータスを定期的にチェックしてください

現在のソリューション-A / Wトレースチケットフィードバック

今のところ、将来のリリースでフィードバックと修正の可能性が得られるWPまで、クラスからそれらの行を削除してください。

それは何時ですか......それはデバッグ時間です!!!!!

これを完全にテストする時間がありました。私はあなたのコードを取り出してテストしました:

  • 私のv4.3ローカルインストール

  • v4.4.0ローカルインストール

  • 私のv4.4.1ローカルインストール

  • Hello World投稿とSample Pageページのみで新しいv4.4.1ローカルインストールを完了します

パーマリンクを設定して

  • default そして

  • Post Name

これは、テストポスト内で4ページを作成するためのテストコードです。

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        'Hello World Page 2',
        'Hello World Page 3',
        'Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

私もテストしました

add_filter('content_pagination', 'custom_content', 10, 2);
function custom_content($pages, $post) {
    $pages_to_add = [
        '<!--nextpage--> Hello World Page 2',
        '<!--nextpage--> Hello World Page 3',
        '<!--nextpage--> Hello World Page 4',
    ];

    foreach ( $pages_to_add as $page_to_add ){
        $pages[]  = html_entity_decode(
            stripslashes(
                $page_to_add
            )
        );
    }

    return $pages;
}

良い手段のために

すべてのインストールおよびパーマリンク構造で、すべてのコードが機能します(v4.3を除くcontent_pagination)。

またSample Page、静的なフロントページとして設定しましたが、オリジナルの回答および** EDIT

したがって、結論は、これはコアのバグやコアの他のバグとは関係がないということです。コメントから、ページングされた投稿ページでクエリされたオブジェクトの設定が解除されるため、デバッグする必要があります。残念ながら、この問題は現在ローカライズされているため、正確な解決策を示すことはできません。

問題のデバッグ

問題をデバッグするには、次のワークフローを使用する必要があります

  • たくさんの砂糖と一緒に大量の高カフェインコーヒーを手に入れましょう

  • あなたのデータベースをバックアップしてください

  • 次のプラグインをダウンロードしてインストールします(どのプラグインにも所属していません

    • 通常のデバッグ用のデバッグオブジェクト。インストールしてセットアップしたら、プラグインによって強調表示される可能性のある明らかなバグをすべて修復します。明らかなバグがある場合は、次の主要な箇条書きに進まないでください。最初に修正する

    • 次の箇条書きに進む前にDBの修復とクリーンアップに使用するDBマネージャー

  • すべてのキャッシュ、ブラウザ、プラグインをクリアします

  • 適切な測定のために、すべてのプラグインを非アクティブ化し、すべてのキャッシュを再度クリアします。この問題はリダイレクトの問題のように見えるため、おそらくリダイレ​​クトに関係する可能性のあるすべてのプラグインを最初に非アクティブ化するでしょう。1つのプラグインがまだv4.4と互換性がない可能性があります。問題が持続するかどうかを確認し、持続する場合は次の箇条書きに進み、そうでない場合はこれをさらに詳しく見てみましょう

    すべてのプラグインを非アクティブ化することから始めます。また、問題の原因として明らかなプラグインを非アクティブ化することから始めることもできます。すべてのプラグインをアクティブ化した後、インストールを適切にテストします。問題の原因となった最初のアクティブ化されたプラグインが原因です。その場合は、デバッグの詳細をプラグイン作成者に連絡してください。念のため、プラグインをアクティブ化するたびにキャッシュをクリアしてください。

  • このポイントに到達した場合、前の箇条書きでは問題を解決できませんでした。次のステップは、テーマを問題として排除するために、バンドルされたテーマに切り替えることです。もう一度、キャッシュをクリアします。

  • すべてが失敗した場合は、さらに2つのオプションがあります

    • 削除.htaccessしてWordPressに新しいものを作成させる

    • WordPressを再インストールする

これで問題が解決するはずです。そうでない場合は、問題を引き起こしている可能性のあるWordPressコアのバグを考慮する必要があります。

これがバグの発見に役立つことを願っています

更新

私は実際にすべてをより詳細に説明しているように見える以下のtracチケットにリンクすべきだった

上記のtracチケットからの興味深い非常に関連性の高いパッチ

現時点ではそのようなものを具体的にテストすることはできませんが、提案されたパッチを確認してテストする必要があります。私が取り上げることができるのはredirect_canonical()、静的フロントページのページネーションを担当する同じコードが、単一ページのページネーションも担当するということです。

元の回答

単一のページ(静的フロントページなどget_query_var( 'page' )がページ分割に使用します。WordPress 4.4(およびv4.4.1)では、ページネーションに使用get_query_var( 'page' )する際にページネーションの問題を引き起こすバグが発生しました。

現在のバグレポートでは、tracチケット#35365のように、ページネーションに問題がある静的なフロントページのみに言及していますが、バグに関連してget_query_var( 'page' )、これもを使用するシングルポストページネーションにも問題を引き起こすと思いますget_query_var( 'page' )

tracチケットの説明に従ってパッチを試してください。これが機能する場合は、パッチを適用して、このバグが修正されるv4.4.2を待つことができます


1
うまくいけば、これがOPの問題であり、非常に可能性が高いと思われます(今日、これを掘り下げることはできません;-)。
バージール

1
修正を試み、パーマリンクも無効にしました。変化なし。
ミランバー

1
時間があればすぐにこれを調べます。答えはバグにあると感じていますが、それは単に追跡することです。解決策がすぐに見つかることを願っています
Pieter Goosen

2
更新を確認し、バグを発見し、バグレポートも提出しました
Pieter Goosen

2
すべての3つの方法は、これらの行がコメントアウトされたら:)閉じ動作することを確認したチケット35544をあなたに有利に
Milamber

4

指定した3つの例すべてに構文エラーがあることに注意してください。

add_filter('content_pagination', 'custom_content'), 10, 2);

add_action('the_post', 'custom_content'));

add_action('template_redirect', 'custom_content'));

追加)が追加されます。

これらの行を次のように置き換えます。

add_filter( 'content_pagination', 'custom_content', 10, 2);

add_action( 'the_post', 'custom_content' );

add_action( 'template_redirect', 'custom_content' );

一般にグローバルオブジェクトをいじることはお勧めしません。そのため、content_paginationフィルタを使用した最後の例がここに行く方法だと思います。

また、次のように空のページを追加しないようにすることもできます。

if( ! empty( $content ) )
    $pages[] = $content;

)ここにも欠落があります:

$content = html_entity_decode(stripslashes(get_option('custom_content'));

1
私の間違い、余分な)は、実際の実装でそれらが入っているクラスからそれらをコピーして貼り付けることから取り残されました。私はそれらをopから削除しました。残念ながら、content_paginationバージョンでも404エラーは修正されません。
ミランバー

1
$ content行にも欠落している)があります-更新を参照してください。@Milamber
バージール

1
修正済み。opコードで見られる構文エラーは、投稿のために単純化したものです。
ミランバー

2
OK @Milamber
birgire

1
奇妙なことに、Twentyfifteenで2つの異なる開発環境で試してみましたが、どちらも同じ結果になりました。もう一度見てみましょう、ありがとう@birgire
Milamber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.