¿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. Así que 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 coincidir con el enlace permanente de la categoría. Ya tengo una configuración de diseño para mostrar todas las categorías, pero estoy haciendo esto 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.php , pero 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 una paginación natural, idealmente con WP-PageNavi. Cualquier ayuda sería muy apreciada!

    
pregunta gelleproductions 27.05.2016 - 14:57

2 respuestas

2

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

Veamos lo que necesitamos

  • la cantidad de términos

  • la cantidad de términos por página

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

Así que primero necesitamos contar la cantidad de términos. Para esto, usaremos el parámetro count en get_terms()

NOTA:

  • Todo el código no está probado y requiere al menos

    • PHP 5.4

    • WordPress 4.5

Puedes convertirlo fácilmente para trabajar 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, a wp_pagenavi()

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

En este caso, pasaría $max_num_pages a 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 los más de 100 términos por página. Consultar solo los 10 necesarios es mucho más rápido. Entonces, necesitamos saber en qué página estamos, a partir de eso, calcularemos un desplazamiento. Esto se pasará a get_terms() , y le dirá a get_terms() cuántos términos debe omitir desde el punto de inicio inicial.

Una vez que tengamos eso, también debemos decirle a 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 puedes simplemente hacer un bucle normalmente a través de tus términos

Solo una nota, querrá asegurarse de que realmente se le devuelvan los términos de su función get_terms() .

    
respondido por el Pieter Goosen 28.05.2016 - 07:41
1

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

Primero, necesitas 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 te 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. Puedes seguir esto introduciendo un query_var Tu url se verá así: www.example.com/yourcatpage?catpage=2

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

$page_called=get_query_var ( $catpage, 1 )

Desde aquí 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_page categorías, por lo que además necesita:

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

Ahora, recorre los elementos deseados de $cats :

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

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

Ten 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.

    
respondido por el cjbj 27.05.2016 - 18:59

Lea otras preguntas en las etiquetas