Pregunta

Vamos a suponer que tengo los siguientes puestos con los siguientes títulos:

  • posta (se asigna a la 'categoría 1')
  • PostX ( categoría 2 )
  • PostB (categoría 1)
  • postc ( categoría 1 )
  • PostD (categoría 1)
  • Pošty ( categoría 2 )
  • Poste (categoría 1)
    ...

Cuando un visitante leerá el postc, ¿cómo puedo mostrar en la barra lateral:


Mensajes anteriores:
'Posta' (estos son los enlaces aquí, por supuesto)
'PostB'

Postes siguientes:
'PostD'
'Poste'


IOW la anterior y las siguientes 2 puestos de la misma categoría. (Si tiene un puesto más categorías vamos a elegir la primera uno o el último - no importa mucho).

Además, si no se puede mostrar el anterior y siguientes dos mensajes es aceptable también sólo una entrada anterior y siguiente. (Sé que hay algunas funciones WP para esto, pero prefiero que si es posible dos entradas).

También, por supuesto, queremos mostrar el primer 'n' personajes del título (digamos 22). No queremos para mostrar un texto estático como 'Entrada siguiente' o similar.

TIA

¿Fue útil?

Solución

Las funciones de WordPress existentes son sólo para mostrar una entrada anterior o siguiente. Escribí rápidamente las funciones para mostrar cualquier número de puestos.

pegar el siguiente código en el archivo functions.php tema:

function custom_get_adjacent_posts( $in_same_cat = false, $previous = true, $limit = 2 ) {
    global $post, $wpdb;

    $op = $previous ? '<' : '>';

    if ( $in_same_cat ) {
        $cat_array = wp_get_object_terms($post->ID, 'category', array('fields' => 'ids'));

        $join = " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'category' AND tt.term_id IN (" . implode(',', $cat_array) . ")";
    }

    $posts = $wpdb->get_results( $wpdb->prepare( "SELECT p.* FROM wp_posts AS p $join WHERE p.post_date $op '%s' AND p.post_type = 'post' AND p.post_status = 'publish' ORDER BY p.post_date DESC LIMIT $limit", $post->post_date, $post->post_type ) );

    return $posts;
}

function custom_adjacent_posts_links( $in_same_cat = false, $previous = true, $limit = 2 ) {
    $prev_posts = custom_get_adjacent_posts( $in_same_cat, $previous, $limit );
    if( !empty($prev_posts) ) {
        echo ($previous) ? '<h3>Previous Posts:</h3>' : '<h3>Next Posts:</h3>';
        echo '<ul>';
        foreach( $prev_posts as $prev_post ) {
            $title = apply_filters('the_title', $prev_post->post_title, $prev_post->ID);
            echo '<li><a href="' . get_permalink( $prev_post ) . '">' .$title . '</a></li>';
        }
        echo '</ul>';
    }
}

En el archivo de la barra lateral, en la que desea mostrar los mensajes, el uso custom_adjacent_posts_links( true ); para que aparezcan las dos entradas anteriores de la misma categoría y custom_adjacent_posts_links( true, false ); para mostrar los próximos dos puestos en la misma categoría.

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