Pregunta

he estado tratando de establecer una manera de escribir mensajes en una serie en mi sitio. La idea es que cada puesto puede pertenecer a una serie diferente en una taxonomía personalizada. He conseguido casi todo configurar la forma que yo quiero ... con una excepción.

Registro de la Taxonomía

Esta parte está trabajando. Se me ha caído el código siguiente en un módulo adicional:

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 se suma "Etiquetas de la serie" a los mensajes desplegable menú y me da una caja "de la serie de etiquetas" en la pantalla de edición posterior. de trabajo de todo, y que pueden marcar los mensajes como parte de una serie perfectamente. El problema radica en la siguiente sección ...

Añadir elementos de la taxonomía

Mi objetivo es permitir a los lectores a pie a través de una serie de un puesto a la vez, empezando por la más antigua puesto en movimiento hacia delante y cronológicamente. Esto es diferente de una página típica archivo, porque tengo 10 mensajes por página para mis archivos, pero obviamente quiero solo puesto por página para mis series archivo.

He creado un archivo taxonomy-series.php dentro de mi plantilla. Y medio funciona. La primera página funcionará bien - http://localhost/wp/series/my-test-series/ muestra el primer artículo de la serie con la "Entrada siguiente»" que aparece en la parte inferior de la página. Hasta ahora, todo bien ...

Sin embargo, al hacer clic en "Siguiente Entrada»" e ir a la página siguiente (http://localhost/wp/series/my-test-series/page/2/) es a) el artículo equivocado y b) la plantilla incorrecta!

Sin embargo, si fijo "páginas de blog muestran en la mayoría:" a "1" en la página de lectura (se ajusta normalmente a 10), entonces las cosas funcionan bien. Página 2 muestra el segundo artículo de la página 3 muestra la tercera, etc.

Así que ... ¿qué necesito a doble control para forzar la página de archivo taxonomía para mostrar sólo un puesto 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?

¿Fue útil?

Solución

Hola @EAMann

Me estremezco en cualquier momento que tengo que hacer algo creativo con los URL en WordPress como el sistema de URL está en mi opinión, con mucho, el aspecto más poco elegante de WordPress. Siempre me siento como que estoy teniendo que luchar WordPress para conseguir que haga lo que yo quiero, y que WordPress está luchando activamente mi espalda relacionado con las direcciones URL. Así que con eso abridor ...

Pensamiento a través de su tema voy a hacer una sugerencia que no es exactamente lo que usted pidió. Si no lo encuentra para ser lo que busca está bien simplemente por favor no a nadie a votar porque yo sólo trato de ayuda.

Taxonomía No es solo incremento y no tiene Meta

Uno de los problemas con lo que usted está tratando de hacer es no el sistema de taxonomía hace un solo pedido de incremento y no tiene meta . Por ejemplo, en una serie de correos 3 es posible encontrar un acuerdo con IDs de 373, 411 y 492; usted puede darse cuenta de eso 373 = #1, 411 = #2 y 492 = #3 pero eso es todo casualidad y respecto a la otra. Es como tratar a la ubicación de la raíz de su sitio de WordPress en el plugin de código, pero no se sabe cuántos niveles de profundidad se almacenará el código. Por supuesto, puede escribir código para entender todo esto y el mapa de ellos, pero que se complica y no estoy seguro de que tienes mucho valor de tratar de averiguarlo en lugar de utilizar un enfoque diferente.

explícitamente asignar los números de página

Así que la primera cosa que sugeriría es que explícitamente asignar su números de página para cada puesto en sus series mediante meta del poste / personalizada campos (I recogió el término installment en lugar de page porque tenía más sentido para mí, pero claramente se podría utilizar cualquier término que va bien para el caso de uso.)

Asignación de Números de página / a plazos tiene la ventaja de que tener el control completo y de esa manera usted sabrá qué se debe corregir cuando tantos fuera de servicio y si desea reordenar puede hacerlo simplemente cambiando los números. Estoy asumiendo que tendrá una METABOX editar un nombre de _installment campo personalizado para la selección de los números a plazos (y que incluso podría gestionar los números de malabares / a plazos a través de AJAX si usted desea conseguir tan creativo que nunca tenga páginas fuera de sincronía. )

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

No será ir a fondo ya que sé que por lo general tiene skilz WordPress loco así que voy a punto $wp_rewrite->add_rule() que es la cruz de conseguir todo esto con el trabajo. Todo lo demás es simplemente proporcionando apoyo en torno a consecuencia de esa función. Utilice el gancho init asignar su regla 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
}

Uso gancho parse_query para traducir URL para consulta de Vars

La segunda mitad de esta solución utiliza el gancho parse_query que sé que mucho estar familiarizado. En general capturamos el query_vars definido en init y capturado a través de la regla de URL y convertirlos en lo que tenemos que consulta los mensajes de WordPress con taxonomy + term manejo de su series y meta_key + manejo de la cuota / página asignada explícitamente meta_value:

<?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 ido a mucha más profundidad que explica una respuesta, pero ya es tarde, he tenido la falta de sueño en las últimas 48 horas, y lo más importante que saber que puede averiguarlo, es probable que sólo necesita una cosa he mencionado aquí.

Así que espero que os guste esta solución. Incluso si usted no las dos partes con init y parse_query y la $wp_rewrite->add_rule() y la $query->query_vars[] respectivamente, son lo que necesita, incluso si quiere seguir con su arquitectura original. Buena suerte y esperando a ver que cuando se someta a este procedimiento y en línea!

De todos modos, esperanza tsu ayuda.

Otros consejos

Aquí está el código que utilizo para modificar el número de puestos 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 este trabajo con el intento taxonomía personalizada con nativos (categorías, etiquetas) para comprobar si el problema es con el código en sí, la taxonomía o algo completamente distinto.

Además, no estoy seguro de si se ha perdido o dejado fuera de este, pero $ paginado no es variable global. Debe ser descabellada como get_query_var ( 'paginado')

Una vez que me he enfrentado a un problema de esto y pasó veces hrs a duras horas tirando del pelo. Busqué en Google y no encontré ninguna solución específica sobre los temas. He encontrado varios talentos artículo pero no satisfacían mis problemas. En realidad, a medida taxonomía página de archivo de paginación es depende de algunos ajustes de argumentos de funciones relacionadas. Así que en realidad estoy yendo aquí compartiendo mis pensamientos de la solución del problema taxonomía archivo de paginación.

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

(1) No ponga exclude_from_search clave de parámetro como parámetro argumento register_post_type o conjunto que 'exclude_from_search' => false. Por defecto está configurado false.

(2) La taxonomía que será su uso con el conjunto 'taxonomies' => 'custom_taxonomy_name' medida Tipo cargo como parámetro argumento register_post_type o uso register_taxonomy_for_object_type() directamente. taxonomías personalizadas todavía tienen que estar registrados en register_taxonomy().

(3) al consultar dentro new WP_Query ($args)

i) Si no se encuentra en uso static front page administrador antes new WP_Query($args)

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

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

ii) Si se establece en la portada uso administrador estática antes de 'nuevo WP_Query ($ args)':

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

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

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

Si no se establece portada estática, entonces usted debe utilizar el parámetro page en matriz de argumentos new WP_Query ($arg).

(4) Uso de Wordpress función paginate_links( $args ) como el ejemplo siguiente para hacer la paginación en el 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 salida de la función paginate_links() la ul li lista con la clase page-numbers. Si utiliza la clase inyectar pagination de arranque a la ul con la ayuda de javascript o jQuery y un bonito paginación de lujo tendrá salida.

La esperanza ahora se puede disfrutar de la paginación de la plantilla de archivo taxonomía sin ningún problema 404: -)

Licenciado bajo: CC-BY-SA con atribución
scroll top