WordPress: enlace_post_anterior / enlace_post_siguiente por orden alfabético?

4 minutos de lectura

avatar de usuario
Cthulhu

Estoy desarrollando un sitio web de wordpress con publicaciones personalizadas que se ordenan alfabéticamente en el bucle.

<!-- 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 lujoso allí, solo un bucle normal.

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

  • Ese complemento no se ha actualizado en años, no estoy seguro de si todavía funciona. En caso de que no sea así, [I came up with a solution][1] que se puede agregar a su functions.php. ¡Espero eso ayude! [1]: wordpress.stackexchange.com/questions/166932/…

    – Will Lanni

    11 mayo 2020 a las 21:58

Parece que este complemento hace lo que buscas, 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>

  • ¡Este complemento no se ha actualizado en un par de años, pero aún funciona muy bien! Alguien debería volver a probarlo para que pueda volver a las opciones instalables en el administrador de wp. Tuve que volver a subirlo desde el sitio de wp.

    – eyal_katz

    23 de agosto de 2016 a las 22:42

avatar de usuario
danbrellis

Puede hacer esto usando filtros en el get_adjacent_post función.

En su archivo functions.php, agregue:

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 single.php, agregue los filtros antes de llamar a las funciones de enlace de publicaciones anteriores/siguientes:

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 post_type 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 post_type específico single.php.

Esto funcionó muy bien para mí, pero puede haber algunas limitaciones si planea combinar esto con publicaciones en el mismo término…

  • A la respuesta de Danbrellis le falta un apóstrofe. 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); Debiera ser remove_filter('get_previous_post_sort', 'mytheme_previous_post_orderby_name', 10); (sin embargo, incluso con esa solución, no puedo hacer que esto funcione)

    – fontanero

    21 de octubre de 2015 a las 4:17


  • plumbinator- gracias por captar eso. te estas acercando? Estaré encantado de echarle un vistazo si tienes algún código de muestra.

    – danbrellis

    21/10/2015 a las 17:52

  • la OR p.post_status = 'private' solo debería aplicarse a los usuarios registrados, ¿no?

    – bocina31

    19 de febrero de 2020 a las 10:03

  • Esto no permite términos excluidos.

    – jake

    24 de abril de 2020 a las 15:32

¿Ha sido útil esta solución?