web-dev-qa-db-ja.com

リンクを介して検索結果とカテゴリの一覧でページ分割のオン/オフを切り替えるにはどうすればよいですか。

このWebサイトでは、検索またはカテゴリクエリの結果全体を1つの大きなドキュメントとして印刷できるように、ページ付けを無効にすることができます。明らかに思えるので、私はプラグインが見つからなかったのには驚きました...今は多分私はその理由を知っています。

私はしばらくこれに取り組んできました、そして私はWordPressの私の理解がちょうどそれに達していないのではないかと思っています...私が試みてきたものは以下の通りです:

  1. uRLにクエリ文字列を追加します。?onepageprint = 1(動作します)
  2. 'ページネーションを無効にする'関数を登録する(動作する)
  3. クエリ文字列をテストし、条件付きで関数を呼び出します(機能しません)。

Ithink私が抱えている問題は、URLからクエリ文字列を取得してそれをテストすることができる場所に到達する前に、WordPressプロセスでページ付けが早すぎる設定になっていることです。コアをハックせずに!)

2つの質問と考え

  1. 私はこれについて正しいやり方ですか?
  2. 私の問題の意味は正しいですか、もしそうなら、回避策はありますか?そして、これが実際にはうまくいかない場合(以下の最新の試み)...
  3. redirect_canonicalを使ってこれを行うことが可能かもしれません(私は全く理解していないと認めます!)

私はこれの無限のバリエーションに戸惑いました - ここに最新の試みがあります(若干の重複があるかもしれませんが)。クエリ文字列を設定してURLから取り出すことはうまくいくようです、そしてページ付けを無効にする機能も働きます...しかしそれが定位置にあるときalwaysは動作します(または動作しません)。条件付きでオン/オフを切り替える方法はありません。

Functions.phpで:

/* register custom query var (from URL) to toggle pagination */
function jr_add_query_vars_filter( $displayvars ){
    $displayvars[] = "onepageprint";
    return $displayvars;
}
add_filter( 'query_vars', 'jr_add_query_vars_filter' );
get_query_var( 'onepageprint', 0 );

/* disable pagination conditionally on custom query var setting (from URL query string) 
 * NOT WORKING YET */
add_Action('init', 'remove_pagination');

function remove_pagination() {
if ( ! $onepageprint == 1 )
    return; // stop here.
    /* Disable content pagination, based on
     * https://wp-types.com/forums/topic/remove-pagination-from-archive-view/ */
    add_action('parse_query', 'no_nopaging');
    function no_nopaging($query) {
    $query->set('nopaging', 1);
    }
}

ページテンプレートで(多くの試みのうちの1つ) - 私はこれ、あるいはそれに類するものがsearch.phpとarchive.phpの両方に入る必要があると思います:

// call no-pagination function - DIDN'T WORK
if ( $onepageprint == 1 ) {
no_nopaging($query);
}

私はこれがいくらか理にかなっていることを願っています、そしてそれに答えるためにあなたが私の設定についてもっと必要とするなら私に知らせてください。残念ながら、私は実際のサイトへのリンクを投稿することはできません。それは私的なリサーチサイトなのですから、その上のすべてのものは機密です!

これを行うより良い方法へのいくつかのポインターさえ素晴らしいでしょう。どうもありがとう。

[編集:投稿直後にタイトルが改善!]

1
wwwolf

pre_get_postsにフックすることでうまくいくはずだと思います。

function wpse_254661_remove_pagination( $query ) {
    if ( $query->is_main_query() &&  get_query_var( 'onepageprint', 0 ) ) {
        $query->query_vars['nopaging'] = 1;
        $query->query_vars['posts_per_page'] = -1;
    }
}
add_action( 'pre_get_posts', 'wpse_254661_remove_pagination' );

このように、あなたはそれがフェッチされる直前にあなたのクエリを修正することができて、クエリオブジェクトはフックによって正しく関数に渡されます。メインクエリにのみ影響を与えるチェックもあります。

0
JHoffmann