2012-03-29 21 views
5

Estoy desarrollando un sitio web de wordpress con publicaciones personalizadas que están ordenadas alfabéticamente en el ciclo.Wordpress: previous_post_link/next_post_link por orden alfabético?

<!-- THE ARGS --> 
<?php global $query_string; 
$args = wp_parse_args($query_string); 
$args = array(
    'post_type' => 'custom_post', 
    'orderby' => 'title', 
    'order' => 'ASC', 
    'posts_per_page' => -1, 
    ); ?> 

<!-- THE LOOP --> 
<?php $wp_query = new WP_Query($args); ?> 
<?php while ($wp_query->have_posts()) : $wp_query->the_post(); ?> 
<?php endwhile; ?> 
<?php wp_reset_query(); ?> 

Nada sofisticado, solo un lazo normal.

Cuando abro una publicación, en su página tengo el usual previous_post_link y next_post_link para poder navegar por las publicaciones. Sin embargo, esto se hace por orden cronológico de las publicaciones, y deseo hacerlo con el mismo orden alfabético que usé en el ciclo, por supuesto. Cualquier ayuda en este asunto sería muy apreciada. ¡Gracias de antemano!

Respuesta

6

Parece que this plug-in hace lo que está buscando, por ejemplo .:

<ul class="pager"> 
     <?php previous_post_link_plus(array('order_by' => 'post_title')); ?> 
     <?php next_post_link_plus(array('order_by' => 'post_title')); ?> 
</ul> 
+0

Eso es excelente. Muchas gracias, amigo. – Cthulhu

+0

¡Este complemento no se ha actualizado en un par de años, pero sigue funcionando de maravilla! Alguien debería probarlo nuevamente para poder volver a las opciones de instalación en el administrador de wp. Tuve que volver a subirlo desde el sitio wp. –

0

Ese plugin no se ha actualizado en años, no estoy seguro si todavía funciona. En caso de que no lo haga, I came up with a solution que se puede agregar a su functions.php. ¡Espero eso ayude!

3

Puede hacerlo utilizando filtros en la función get_adjacent_post.

En el archivo functions.php, añadir:

function mytheme_previous_post_orderby_name($orderby){ 
    return "ORDER BY p.post_title DESC LIMIT 1"; 
} 
function mytheme_previous_post_where_name(){ 
    global $post, $wpdb; 
    return $wpdb->prepare("WHERE p.post_title < %s AND p.post_type = %s AND (p.post_status = 'publish' OR p.post_status = 'private')", $post->post_title, $post->post_type); 
} 
function mytheme_next_post_orderby_name($orderby){ 
    return "ORDER BY p.post_title ASC LIMIT 1"; 
} 
function mytheme_next_post_where_name(){ 
    global $post, $wpdb; 
    return $wpdb->prepare("WHERE p.post_title > %s AND p.post_type = %s AND (p.post_status = 'publish' OR p.post_status = 'private')", $post->post_title, $post->post_type); 
} 

Luego, en su página de single.php agregar los filtros antes de llamar a los mensajes anteriores/siguientes funciones: enlazan

add_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10, 1); 
add_filter('get_next_post_sort', 'mytheme_next_post_orderby_name', 10, 1); 

add_filter('get_previous_post_where', 'mytheme_previous_post_where_name', 10); 
add_filter('get_next_post_where', 'mytheme_next_post_where_name', 10); 

the_post_navigation(); 

remove_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10); 
remove_filter('get_next_post_sort', 'mytheme_next_post_orderby_name', 10); 
remove_filter('get_previous_post_where', 'mytheme_previous_post_where_name', 10); 
remove_filter('get_next_post_where', 'mytheme_next_post_where_name', 10); 

Si desea verificar su tipo de post_posicion específico, puede agregar un si alrededor de la sección de agregar filtro:

if($post->post_type == 'my_custom_post_type'){ 
    add_filter(...); 
    the_post_navigation(); 
    remove_filter(...); 
} 

o, simplemente puede usar un archivo individual de tipo post_.php!

Esto funcionó muy bien para mí, pero puede haber algunas limitaciones si usted está planeando en la combinación de este con plaza en el mismo término ...

+1

La respuesta de Danbrellis tiene un apóstrofo perdido. No puedo comentar ya que esta es mi primera cuenta y no tengo suficiente representante para comentar. remove_filter ('get_previous_post_sort', mytheme_previous_post_orderby_name ', 10); Debería ser 'remove_filter ('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10);' (sin embargo, incluso con esa corrección, no puedo hacer que esto funcione) – plumbinator

+0

plumbinator- gracias por captar eso. te estás acercando? Me complace echar un vistazo si tienes algún código de muestra. – danbrellis

Cuestiones relacionadas