Как создать нумерованный список всех категорий на моем сайте?

9

Я хочу отобразить страницу архива с нумерацией страниц, на которой перечислены все категории на моем сайте, и каждая ссылка ведет на эту страницу архива конкретной категории. Так что это будет похоже на страницу архива категории архивов.

Каждая категория на моем сайте имеет свой эскиз, созданный вручную, чтобы соответствовать постоянной ссылке категории. У меня уже есть настройка макета для отображения всех категорий, но я делаю это с помощью пользовательского шаблона страницы, поэтому нет нумерации страниц. Это означает, что все категории отображаются на одной странице, что немного раздражает (у меня более 100 категорий).

Мой текущий архив настроен с определенным именем шаблона пользовательской страницы, page-catlist.phpно я хочу изменить его на любой другой тип файла шаблона.

Вот текущий код, который я использую для вывода всех категорий на одной странице:

$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. Любая помощь будет принята с благодарностью!

gelleproductions
источник
Это будет много усилий;)
Sumit
@ Думаю, что на самом деле это довольно легко без каких-либо усилий ;-)
Питер Гусен

Ответы:

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
@ Думаю, это будет работать next_posts_link(), previous_posts_link()и paginate_links(). Это также будет работать с любой функцией подкачки, где вы можете передать целочисленное значение функции, как моя функция подкачки здесь . Что касается wp_pagenavi(), я не могу сказать да или нет, поскольку я действительно не знаю, как работает эта функция, вам нужно будет проверить это. В моем коде выше $max_num_pagesсодержится количество страниц, это целочисленное значение, именно эту переменную нужно передать функциям для вычисления нумерации страниц
Питер Гусен
1
Отдельное спасибо вам и @cjbj, так как я думаю, что оба эти решения наверняка сработают. Посмотрев вокруг, я нашел кое-что из WP-PageNavi, объясняющее, как это может работать ... Конечно, всегда можно выполнить пользовательскую нумерацию страниц, так что в любом случае я думаю, что эти решения являются лучшими.
gelleproductions
1

Я не знаком с WP-PageNavi, но подозреваю, что он предполагает работу с постами, поэтому он может легко испортиться, если вы будете использовать его в цикле, подобном вашему. Возможно, CSS еще может помочь в оформлении вашего HTML. Во всяком случае, настроить свою собственную нумерацию страниц не так сложно.

Во-первых, вам нужно знать, сколько существует категорий:

$cat_amounts=count($cats);

Далее вам нужно определить, сколько элементов на странице вы хотите:

$cats_per_page=20;

Это даст вам количество страниц:

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

Третья часть информации, которая вам нужна, это страница, на которой вы находитесь. Вы можете отслеживать это, введя 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.

cjbj
источник
Существует гораздо более простой подход, который чище и быстрее ;-)
Питер Гусен
На самом деле, я не думаю, что наши подходы такие разные. Вы позволяете MySQL обрабатывать смещение, я оставляю это PHP.
cjbj