web-dev-qa-db-ja.com

自分のサイトにすべてのカテゴリのページ区切り付きリストを作成する方法?

自分のサイトのすべてのカテゴリを一覧表示するページ区切り付きのアーカイブページを表示したいのですが、各リンクはその特定のカテゴリのアーカイブページにリンクしています。そのため、これはカテゴリアーカイブのアーカイブページのようになります。

私のサイトの各カテゴリには、そのカテゴリのパーマリンクに合わせて手動で作成されたカスタムサムネイルがあります。私はすでにすべてのカテゴリを表示するためのレイアウト設定を持っていますが、私はカスタムページテンプレートを使ってこれをしているので、ページ付けはありません。これは、すべてのカテゴリが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を使用して自然なページ付けを追加できるように、これを行うためのより良い方法があることを願っています。任意の助けは大歓迎です!

9

用語/カテゴリ/タグのリストをページングするのは非常に簡単です、そしてそれを達成するためには、最小限の情報が必要です。

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

  • 期間の量

  • 1ページあたりの用語数

  • get_terms()get_terms()の使用法はバージョン4.5で変更されました )。必要に応じてget_categories()を使用することもできます。get_categories()get_terms()のラッパー関数です。

だから最初に我々は用語の数を数える必要があります。このために、get_terms()countパラメータを使います。

注意:

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

    • PHP 5.4

    • ワードプレス4.5

これを古いバージョンのPHPおよびWordPressで動作するように簡単に変換できます。

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

用語の数がわかったので、1ページに必要な用語の数を設定できます。

$terms_per_page = 10;

以上のことから、ページ数を計算することができます。ここでの値は、必要なページ付け関数、あなたの場合はwp_pagenavi()に渡されます。

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

この場合は、ページ区切り関数に$max_num_pagesを渡します。

次の部分は、オフセットを計算することです。物事を最適化し続けるために、1ページあたりの関連語句だけを取得したいと思います。 1ページに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()関数から返された用語を持っていることを確認したいでしょう。

2
Pieter Goosen

私はWP-PageNaviには馴染みがありませんが、投稿を扱うことを前提としていると思われるので、自分のようにループで使用すると簡単に失敗する可能性があります。おそらく、CSSはまだあなたのHTMLのスタイルを整えるのに役立つかもしれません。とにかく、あなた自身のページネーションを設定することはそれほど難しくありません。

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

$cat_amounts=count($cats);

次に、あなたはあなたが欲しいページあたりのアイテム数を決める必要があります:

$cats_per_page=20;

これでページ数がわかります。

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

あなたが必要とする3番目の情報はあなたが現在いるページです。あなたは query_var を導入することによってこれを追跡することができます。あなたの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があることを考慮したとき、私はいくつかの間違いをしたかもしれません。

1
cjbj