Як створити список болю за всіма категоріями на своєму сайті?


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. Будь-яка допомога буде дуже вдячна!


Це докладе багато зусиль;)
Суміт

@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()дійсно спрацює в цьому випадку?
Суміт

1
@Sumit це буде працювати з next_posts_link(), previous_posts_link()і paginate_links(). Вона також буде працювати з будь-якою функцією підкачки , де ви можете передати ціле значення функції, як моя функція підкачки тут . Щодо того wp_pagenavi(), я не можу сказати так чи ні, оскільки я дійсно не маю уявлення, як працює ця функція, вам потрібно буде її перевірити. У моєму коді вище, $max_num_pagesвміщено кількість сторінок, це ціле значення, саме цю змінну вам потрібно перейти до функцій для обчислення сторінок
Пітер Гузен

1
Особлива подяка і вам, і @cjbj, оскільки я думаю, що обидва ці рішення, безумовно, можуть спрацювати. Подивившись навколо, я знайшов деякі речі WP-PageNavi, що пояснюють, як це може працювати ... Зрозуміло, завжди можна прокатати користувацьку сторінку, тому в будь-якому випадку я вважаю, що ці рішення найкращі.
гелепродукції

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.


Є набагато простіший підхід, який чистіший і швидший ;-)
Пітер Гусен

Власне, я не думаю, що наші підходи настільки різні. Ви дозволяєте MySQL обробляти компенсацію, я залишаю це PHP.
cjbj
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.