¿Cómo crear una lista paginada de todas las categorías en mi sitio?

9

Quiero mostrar una página de archivo con paginación que enumera todas las categorías en mi sitio, y cada enlace va a esa página de archivo de categoría en particular. Entonces esto sería como una página de archivo de archivos de categoría.

Cada categoría en mi sitio tiene una miniatura personalizada creada manualmente para que coincida con el enlace permanente de la categoría. Ya tengo una configuración de diseño para mostrar todas las categorías, pero lo estoy haciendo con una plantilla de página personalizada, por lo que no hay paginación. Esto significa que todas las categorías se muestran en una sola página, lo cual es un poco molesto (tengo más de 100 categorías).

Mi archivo actual está configurado con un nombre de plantilla de página personalizado específico, page-catlist.phppero estoy dispuesto a cambiarlo a cualquier otro tipo de archivo de plantilla.

Aquí está el código actual que estoy usando para generar todas las categorías en una página:

$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()
}

Espero que haya una mejor manera de hacer esto para poder agregar paginación natural, idealmente con WP-PageNavi. Cualquier ayuda sería muy apreciada!

gelleproductions
fuente
Eso va a ser un gran esfuerzo;)
Sumit
@Sumit, en realidad es bastante fácil sin casi ningún esfuerzo ;-)
Pieter Goosen

Respuestas:

2

Paginar una lista de términos / categorías / etiquetas es bastante fácil, y para lograrlo, necesita información mínima.

Veamos que necesitamos

  • la cantidad de términos

  • la cantidad de términos por página

  • get_terms()( Solo tenga en cuenta que el uso de get_terms()han cambiado en la versión 4.5 ). También puede usar get_categories()si lo desea, get_categories()es solo una función de envoltura paraget_terms()

Entonces, primero debemos contar la cantidad de términos. Para esto, usaremos el countparámetro enget_terms()

NOTA:

  • Todo el código no se ha probado y requiere al menos

    • PHP 5.4

    • WordPress 4.5

Puede convertir esto fácilmente para que funcione con versiones anteriores de PHP y WordPress

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

Ahora que conocemos la cantidad de términos, podemos establecer la cantidad de términos que necesitamos por página, digamos 10

$terms_per_page = 10;

De lo anterior, ahora podemos calcular cuántas páginas tendremos. El valor aquí se pasará a la función de paginación requerida, en su caso, awp_pagenavi()

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

En este caso, pasaría $max_num_pagesa su función de paginación

La siguiente parte sería calcular nuestro desplazamiento. Solo queremos recuperar la cantidad relevante de términos por página para mantener las cosas optimizadas. No necesitamos todos los más de 100 términos por página. Consultar solo los 10 necesarios es mucho más rápido. Por lo tanto, necesitamos saber en qué página estamos, a partir de eso, calcularemos un desplazamiento. Esto se pasará a get_terms(), y le dirá get_terms()cuántos términos omitir desde el punto de partida inicial.

Una vez que tengamos eso, también debemos decir get_terms()que solo devuelva 10 términos. Veamos el código de esta pieza.

$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
    ]
);

Solo tendrá 10 términos por página según la paginación. Ahora puede recorrer normalmente sus términos

Solo una nota, querrás asegurarte de que realmente tienes términos devueltos de tu get_terms()función.

Pieter Goosen
fuente
Genial;) Pero no sabía cómo construir marcado de paginación? wp_pagnavi()realmente funcionará en este caso?
Sumit
1
@Sumit esto funcionaría con next_posts_link(), previous_posts_link()y paginate_links(). También funcionaría con cualquier función de paginación donde puede pasar un valor entero a la función, como mi función de paginación aquí . En cuanto a wp_pagenavi()eso, no puedo decir sí o no, ya que realmente no tengo idea de cómo funciona esa función, tendrá que probarla. En mi código anterior, $max_num_pagescontiene la cantidad de páginas, es un valor entero, es esta variable la que debes pasar a las funciones para calcular la paginación
Pieter Goosen
1
Un agradecimiento especial tanto para usted como para @cjbj, ya que creo que ambas soluciones ciertamente podrían funcionar. Después de mirar alrededor, he encontrado algunas cosas de WP-PageNavi que explican cómo puede funcionar ... De acuerdo, siempre es posible desplegar una paginación personalizada, por lo que creo que estas soluciones son las mejores.
gelleproductions
1

No estoy familiarizado con WP-PageNavi, pero sospecho que se supone que se trata de publicaciones, por lo que podría arruinarse fácilmente si lo usa en un bucle como el suyo. Quizás el CSS aún podría ser útil para diseñar su html. De todos modos, configurar tu propia paginación no es tan difícil.

Primero, necesita saber cuántas categorías hay:

$cat_amounts=count($cats);

A continuación, debe determinar cuántos elementos por página desea:

$cats_per_page=20;

Esto le dará la cantidad de páginas:

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

La tercera información que necesita es la página en la que se encuentra. Puede realizar un seguimiento de esto introduciendo una query_varSu URL luego se verá así:www.example.com/yourcatpage?catpage=2

Antes de comenzar el ciclo, debe saber qué página se llama:

$page_called=get_query_var ( $catpage, 1 )

A partir de esto, puede llamar al primer elemento que desea mostrar:

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

y el último:

$last_element=$page_called*$cats_per_page-1;

La última página puede contener menos de $cats_per_pagecategorías, por lo que además necesita:

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

Ahora, recorra los elementos deseados de $cats:

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

Después del ciclo, puede usar las variables para generar etiquetas anteriores / siguientes o no otro tipo de navegación.

Tenga en cuenta que en realidad no probé este código. Es posible que haya cometido algunos errores al tener en cuenta que el primer elemento de una matriz tiene la clave 0.

cjbj
fuente
Hay un enfoque mucho más fácil que es más limpio y rápido ;-)
Pieter Goosen
En realidad, no creo que nuestros enfoques sean tan diferentes. Dejas que MySQL maneje el desplazamiento, lo dejo a PHP.
cjbj