マイサイトのすべてのカテゴリのページ付けされたリストを作成する方法


9

私のサイトのすべてのカテゴリをリストするページネーション付きのアーカイブページを表示したいのですが、各リンクはその特定のカテゴリのアーカイブページに移動します。したがって、これはカテゴリアーカイブのアーカイブページのようなものです。

私のサイトの各カテゴリには、カテゴリのパーマリンクに一致するように手動で作成されたカスタムサムネイルがあります。すべてのカテゴリを表示するレイアウト設定はすでにありますが、カスタムページテンプレートを使用してこれを行っているため、ページ付けはありません。つまり、すべてのカテゴリが1つのページに表示され、少し面倒です(100以上のカテゴリがあります)。

現在のアーカイブは特定のカスタムページテンプレート名でセットアップされていますが、page-catlist.phpこれを他のタイプのテンプレートファイルに変更することもできます。

これは、1つのページにすべてのカテゴリを出力するために使用している現在のコードです。

$args = array(
  'orderby' => 'name',
  'order' => 'ASC'
);
$cats      = get_categories( $args );
$thm_pre   = 'http://example.com/images/thumbs/';
$thm_end   = '.png';

foreach($cats as $cat) {
    $thumbnail = $thm_pre.$cat->slug.$thm_end;
    // output the loop HTML here
    // basically a list of category names & thumbs 
    // all linked to the cat URL by get_category_link()
}

WP-PageNaviを使用して、理想的には自然なページネーションを追加できるようにするためのより良い方法があることを願っています。どんな助けでも大歓迎です!


それは多くの努力になるでしょう;)
Sumit

@Sumitそれは実際にはほとんど努力なしで非常に簡単です;-)
Pieter Goosen

回答:


2

用語/カテゴリ/タグのリストのページングは​​非常に簡単であり、それを実現するには、最小限の情報が必要です。

必要なものを見てみましょう

  • 用語の量

  • ページあたりの用語の量

  • get_terms()ただ注意してください、get_terms()バージョン4.5で使用方法が変更されました)。get_categories()必要に応じて使用することもできます。これget_categories()は単なるラッパー関数です。get_terms()

したがって、最初に用語の数を数える必要があります。このために、countパラメーターを使用しますget_terms()

注意:

  • すべてのコードはテストされておらず、少なくとも

    • PHP 5.4

    • WordPress 4.5

これを簡単に変換して、古いバージョンのPHPおよびWordPressで動作させることができます

$taxonomy   = 'category';
$term_count = get_terms( 
    [
        'taxonomy'  => $taxonomy,
        'fields'    => 'count'
    ]
);

用語の量がわかったので、ページごとに必要な用語の量を設定できます。たとえば、10

$terms_per_page = 10;

上記のことから、ページ数を算出することができます。ここの値は、必要なページネーション関数に渡されます。wp_pagenavi()

$max_num_pages = ceil( $term_count/$terms_per_page );

この場合、$max_num_pagesページネーション関数に渡します

次の部分は、オフセットを計算することです。最適化を維持するために、ページあたりの関連用語の量のみを取得したいと考えています。ページごとに100以上の用語すべてが必要なわけではありません。必要な10のみを照会する方がはるかに高速です。そのため、どのページにいるかを知る必要があります。そこから、オフセットを計算します。これはに渡されget_terms()get_terms()最初の開始点からスキップする用語の数を通知します。

それが得られたら、get_terms()10項のみを返すように指示する必要もあります。この作品のコードを見てみましょう

$current_page = get_query_var( 'paged', 1 ); // Change to 'page' for static front page
$offset       = ( $terms_per_page * $current_page ) - $terms_per_page;
$terms        = get_terms(
    [
        'taxonomy' => $taxonomy,
        'order'    => 'ASC',
        'orderby'  => 'name',
        'number'   => $terms_per_page,
        'offset'   => $offset
    ]
);

ページネーションに応じて、ページあたりの用語数は10のみになります。あなたは今あなたの言葉を普通にループすることができます

ただのメモですが、実際にget_terms()関数から返された項があることを確認する必要があります。


かっこいい;)しかし、ページネーションのマークアップを作成する方法はありませんでしたか?wp_pagnavi()この場合本当に動作しますか?
Sumit

1
@Sumitこれはnext_posts_link()previous_posts_link()およびで動作しpaginate_links()ます。また、ここに私のページング関数のように、整数値を関数に渡すことができるページング関数でも機能します。に関する限りwp_pagenavi()、私はその機能がどのように機能するのか本当にわからないので、はいまたはいいえと言うことはできません。テストする必要があります。上記の私のコード$max_num_pagesでは、ページ数を保持しています。これは整数値です。ページネーションを計算するために関数に渡す必要があるのはこの変数です
Pieter Goosen

1
あなたと@cjbjの両方に特に感謝します。これらのソリューションはどちらも確実に機能すると思います。周りを見回した後、私はそれがどのように機能するかを説明するいくつかのWP-PageNaviものを見つけました... どちらの方法でもこれらのソリューションが最良であると思うので、カスタムページネーションロールすることは常に可能です。
2016年

1

私はWP-PageNaviに精通していませんが、投稿を処理することを想定しているので、あなたのようなループで使用すると簡単に失敗する可能性があります。おそらく、CSSはまだHTMLのスタイル設定に役立つ可能性があります。とにかく、独自のページネーションを設定することはそれほど難しくありません。

まず、カテゴリがいくつあるかを知る必要があります。

$cat_amounts=count($cats);

次に、ページごとに必要なアイテム数を決定する必要があります。

$cats_per_page=20;

これにより、ページ数がわかります。

$max_pages=ceil($cat_amounts/$cats_per_page);

必要な情報の3番目の部分は、現在のページです。query_varYour urlを導入することで、これを追跡できます。URLは次のようになります。www.example.com/yourcatpage?catpage=2

ループを開始する前に、どのページが呼び出されているかを知る必要があります。

$page_called=get_query_var ( $catpage, 1 )

これから、表示したい最初の要素を呼び出すことができます:

$first_element=($page_called-1)*$cats_per_page)

そして最後のもの:

$last_element=$page_called*$cats_per_page-1;

最後のページには$cats_per_pageカテゴリ未満が含まれている可能性があるため、さらに以下が必要です。

if ($last_element > $cat_amounts) $last_element = $cat_amounts;

次に、目的の要素をループします$cats

for ($i=$first_element;$i=<$last_element;$i++) {
    //do your thing with $cats[$i];
}

ループの後、変数を使用して前/次のタグを生成したり、他のタイプのナビゲーションを実行したりできます。

実際にこのコードをテストしていないことに注意してください。配列の最初の要素のキーが0であることを考慮すると、いくつかの間違いがあったかもしれません。


よりクリーンで高速なはるかに簡単な方法があります;-)
Pieter Goosen

実際、私たちのアプローチはそんなに違うとは思いません。MySQLにオフセットを処理させて、PHPに任せます。
cjbj 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.