it-swarm-es.com

Fijación de Paginación con Archivo de Taxonomía Personalizado.

He estado tratando de configurar una manera de escribir publicaciones en una serie en mi sitio. La idea es que cada publicación pueda pertenecer a una serie diferente en una taxonomía personalizada. He conseguido casi todo configurado como lo quiero ... con una excepción.

Registro de la taxonomía

Esta parte está funcionando. He puesto el siguiente código en un complemento:

function jdm_build_series_taxonomy() {
    $labels = array(
        'name' => _x('Series Labels', 'taxonomy general name'),
        'singular_name' => _x('Series Label', 'taxonomy singular name'),
        'search_items' => __('Search Series Labels'),
        'popular_items' => __('Popular Series Labels'),
        'all_items' => __('All Series Labels'),
        'parent_item' => __('Parent Series Label'),
        'parent_item_colon' => __('Parent Series Label:'),
        'edit_item' => __('Edit Series Label'),
        'update_item' => __('Update Series Label'),
        'add_new_item' => __('Add New Series Label'),
        'new_item_name' => __('New Series Label Name')
    );

    register_taxonomy(
        'series',
        'post',
        array(
            'hierarchical' => true,
            'label' => __('Series'),
            'labels' => $labels,
            'query_var' => true,
            'rewrite' => true
        )
    );
}

add_action( 'init', 'jdm_build_series_taxonomy', 0 );

Esto agrega "Etiquetas de serie" al menú desplegable Publicaciones y me da un cuadro de "Etiquetas de serie" en la pantalla de edición de publicaciones. Todo funciona, y puedo marcar los mensajes como parte de una serie perfectamente. El problema radica en la siguiente sección ...

Listado de artículos en la taxonomía.

Mi objetivo es permitir que los lectores recorran una serie publicación por publicación, comenzando con la publicación más antigua y avanzando cronológicamente. Esto es diferente a una página de archivo típica, porque tengo 10 publicaciones por página para mis archivos, pero obviamente quiero solo una publicación por página para mi serie de archivos.

He creado un archivo taxonomy-series.php dentro de mi plantilla. Y eso la mitad trabaja. La primera página funcionará bien: http://localhost/wp/series/my-test-series/ muestra el primer artículo de la serie con el enlace "Entrada siguiente" "en la parte inferior de la página. Hasta ahora tan bueno ...

Pero cuando hace clic en "Siguiente entrada" "y pasa a la página siguiente (http://localhost/wp/series/my-test-series/page/2/), es a) el artículo equivocado yb) la plantilla incorrecta.

Sin embargo, si configuro "Las páginas del blog se muestran como máximo:" en "1" en la página de Lectura (normalmente se establece en 10), entonces las cosas funcionan bien. La página 2 muestra el segundo artículo, la página 3 muestra el tercero, etc.

Entonces ... ¿qué necesito para volver a verificar para forzar que la página del archivo de taxonomía muestre solo una publicación en cada página? He intentado lo siguiente:

$new_query = wp_parse_args(
    $query_string, 
    array(
        'posts_per_page' => 1,
        'paged' => $paged
    )
);

query_posts($new_query);

y

query_posts($query_string.'&posts_per_page=1&paged='.$paged);

¿En vano ... ideas? ¿Consejos? Sugerencias?

4
EAMann

Hola @EAMann:

Me estremezco cuando necesito hacer algo creativo con las URL en WordPress, ya que el sistema de URL es, en mi opinión, el aspecto más poco elegante de WordPress. Siempre siento que tengo que luchar contra WordPress para que haga lo que quiero, y que WordPress está activamente luchando contra mí en relación con las URL. Así que con ese primer partido ...

Pensando en su problema, voy a hacer una sugerencia que no es exactamente lo que pidió. Si no encuentra lo que está buscando, está bien, por favor, no rechace a nadie, solo estoy tratando de ayudar.

La taxonomía no es un incremento único y no tiene meta

Uno de los problemas con lo que está tratando de hacer es el sistema de taxonomía no hace un solo pedido de incremento y éste no tiene meta. Por ejemplo, en una serie de 3 publicaciones puede encontrar términos con IDs de 373, 411 y 492; puedes imaginar que 373 = #1, 411 = #2 y 492 = #3 pero eso es todo casual y relativo el uno al otro. Es como tratar de ubicar la raíz de su sitio de WordPress en un código de complemento, pero no sabe en qué niveles de profundidad se almacenará su código. Por supuesto, puede escribir código para resolverlo todo y mapearlo, pero eso se complica y no estoy seguro de que obtendría mucho valor tratando de resolverlo en lugar de utilizar un enfoque diferente.

Asigna explícitamente tus números de página

Entonces, lo primero que sugeriría es que usted asigne explícitamente su números de página para cada publicación en su serie usando los campos meta/personalizados de la publicación (elegí el término installment en lugar de page porque tenía más sentido para mí, pero claramente podría usar cualquier término que se ajuste a su caso de uso.)

Asignar números de páginas/cuotas tiene el beneficio de que usted tenga el control total y de esa manera sabrá qué arreglar cuando algo no esté en orden y si desea reordenar, puede hacerlo simplemente cambiando los números. Supongo que tendrá un metabox de edición para un nombre de campo personalizado _installment para seleccionar los números de pagos (e incluso podría administrar/hacer malabares con los números de pagos a través de AJAX si desea ser creativo para que nunca más tener las páginas desincronizadas.)

Utilice $wp_rewrite->add_rule() para asignar explícitamente su URL

No voy a profundizar, ya que sé que, en general, está loco de WordPress, así que solo señalaré que $wp_rewrite->add_rule() es la cruz de hacer que todo funcione. Todo lo demás es simplemente proporcionar apoyo en torno al resultado de esa función. Use el gancho init para asignar su regla de URL:

<?php
add_action('init', 'add_series_installment_url');
function add_series_installment_url() {
  global $wp,$wp_rewrite;
  $wp->add_query_var('series');
  $wp->add_query_var('installment');
  $wp_rewrite->add_rule('series/([^/]+)/(installment-\d+)','index.php?series=$matches[1]&installment=$matches[2]','top');
  $wp_rewrite->flush_rules(false);  // This should really be done in a plugin activation
}

Use el código parse_query para traducir la URL a las variables de consulta

La segunda mitad de esta solución usa el gancho parse_query con el que sé que conozco mucho. En general, capturamos el query_vars definido en init y capturado a través de la regla de URL y los convertimos en lo que necesitamos para consultar las publicaciones de WordPress con taxonomy + term manejando su series y meta_key + meta_value manejando la instalación/página explícitamente asignada:

<?php
add_action('parse_query', 'apply_series_installment_to_query');
function apply_series_installment_to_query(&$query) {
  if (isset($query->query['series']) && isset($query->query['installment']) && 
     preg_match('#^installment-(\d+)$#',$query->query['installment'],$match)) {
    $query->query_vars['post_type'] = 'post';
    $query->query_vars['taxonomy'] = 'series';
    $query->query_vars['term'] = $query->query['series'];
    $query->query_vars['meta_key'] = '_installment';
    $query->query_vars['meta_value'] = $match[1];
    unset($query->query_vars['series']);            // You don't need this
    unset($query->query_vars['installment']);       // or this
    unset($query->query_vars['name']);              // or this
  }
}

Resumen

Normalmente habría profundizado mucho más explicando una respuesta, pero es tarde, he dormido muy poco en las últimas 48 horas, y lo más importante es que sé que puedes resolverlo, probablemente solo necesitabas una cosa que mencioné aquí .

Así que espero que les guste esta solución. Incluso si no las dos partes con init y parse_query y $wp_rewrite->add_rule() y $query->query_vars[] respectivamente son lo que necesita, incluso si desea mantener su arquitectura original. ¡Buena suerte y espero verlo cuando lo haya hecho y en línea!

De todos modos, espero que esto ayude.

6
MikeSchinkel

Aquí está el código que utilizo para modificar el número de publicaciones en las páginas de archivo de categorías y etiquetas:

query_posts( array_merge( array(
'posts_per_page' => 1
), $wp_query->query ) );

Si no puede hacer que esto funcione con una taxonomía personalizada, intente con nativo (categorías, etiquetas) para verificar si el problema está en el código en sí, con la taxonomía o algo completamente distinto.

Además, no estoy seguro de si se saltó esto o lo omitió, pero $ paginado no es una variable global. Debe ser recuperado como get_query_var ('paginado')

2
Rarst

Una vez que he enfrentado un problema sobre esto y he pasado tiempos difíciles de un día a otro tirando del pelo. Busqué en Google y no encontré ninguna solución específica sobre los temas. Encontré el artículo de varios talentos, pero no estaban satisfaciendo mis problemas. En realidad, la paginación de la página de archivo de taxonomía personalizada depende de algunas configuraciones de argumentos de funciones relacionadas. Así que en realidad voy a compartir mis ideas sobre la solución del problema de paginación del archivo de taxonomía.

Cinco cosas que necesita para la paginación de la página de archivo de taxonomía personalizada que funciona perfectamente:

(1) No ponga la clave de parámetro exclude_from_search como parámetro de argumento register_post_type ni la establezca 'exclude_from_search' => false. Por defecto se establece false.

(2) La taxonomía que se usará con el tipo de mensaje personalizado establecido 'taxonomies' => 'custom_taxonomy_name' como parámetro de argumento register_post_type o use register_taxonomy_for_object_type() directamente. Las taxonomías personalizadas aún deben registrarse con register_taxonomy().

(3) Mientras consulta dentro de new WP_Query ($args)

i) Si no está configurado en admin static front page use antes de new WP_Query($args)

$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;

y usar $query = new WP_Query( array( 'paged' => $paged ) );

ii) Si se establece en el uso de la página frontal estática del administrador antes de 'new WP_Query ($ args)':

  $paged = ( get_query_var('page') ) ? get_query_var('page') : 1;

y usar $query = new WP_Query( array( 'page' => $paged ) );

Recuerde utilizar el parámetro posts_per_page y paged en la matriz de argumentos new WP_Query($arg).

Si no se establece la página frontal estática, entonces debe usar el parámetro page en la matriz de argumentos new WP_Query ($arg).

(4) Use la función Wordpress paginate_links( $args ) como en el ejemplo a continuación para representar la paginación en un archivo de plantilla de archivo.

<?php $big = 999999999; // need an unlikely integer
echo paginate_links( array(
                  'base' => str_replace( $big, '%#%', esc_url( get_pagenum_link( $big ) ) ),
                  'format' => '?paged=%#%',  or   '/paged=%#%',  // if using pretty permalink
                   'current' => max( 1, get_query_var('paged') ),
                   'total' => $query->max_num_pages ) ); // Here $max_num_pages is the properties of  new WP_Query() object . It is total number of pages. Is the result of $found_posts / $posts_per_page
 ?>

(5) La función paginate_links() genera el listado de ul li con la clase page-numbers. Si usa bootstrap inyecta pagination class a la ul con la ayuda de javascript o jquery y se mostrará una paginación de lujo Nice.

Espero que ahora pueda disfrutar de la paginación en la plantilla de archivo de taxonomía sin ningún problema 404 :-)

0
saifulmasud