web-dev-qa-db-fra.com

Obtenir les articles précédents et suivants par ID de poste

Comment puis-je obtenir les messages précédents et suivants depuis dehors la boucle? Tout ce que j'essaie de faire en dehors de la requête SELECT personnalisée (en utilisant get_posts ou WP_Query) casse des commandes plus loin dans la page.

J'ai actuellement une fonction récursive qui, espérons-le, trouvera le premier "précédent" post qui satisfait à une certaine condition. Je saisis la première valeur à tester à partir de get_previous_post() mais je ne sais pas comment obtenir la previous_previous_post().

add_action( 'wp_ajax_nopriv_myajax-submit', 'ajax_project_load' );
add_action( 'wp_ajax_myajax-submit', 'ajax_project_load' );

function ajax_project_load() {
    $the_slug = $_POST['slug'];
    $args=array(
      'name' => $the_slug,
      'post_type' => 'projects',
      'post_status' => 'publish',
      'showposts' => 1,
      'ignore_sticky_posts' => 1
    );
    $my_posts = get_posts($args);
    if( $my_posts ) :

        global $post;
        $post = $my_posts[0]; 
        $postCapabilityFilter = $_POST['capFilter']=='undefined' ? $_POST['capFilter'] : substr($_POST['capFilter'], 1);

        $response = json_encode( "Success" );
        header( "Content-Type: application/json" );     


$next_post = get_previous_post();
function filtered_next_post($next_post){
    if($next_post){
        $next_slug = $next_post->post_name;
        $next_ID = $next_post->ID;
        global $wpdb;
        global $postCapabilityFilter;
        $querystr = "
        SELECT $wpdb->postmeta.*
        FROM $wpdb->posts, $wpdb->postmeta
        WHERE $wpdb->posts.post_type = 'projects' 
        AND $wpdb->posts.post_status = 'publish' 
        AND $wpdb->posts.ID = $next_ID
        AND $wpdb->posts.ID = $wpdb->postmeta.post_id
        AND $wpdb->postmeta.meta_key = '_slideshow_content'
        ORDER BY $wpdb->posts.post_name DESC
        ";
        $nextProjQuery = $wpdb->get_results($querystr, OBJECT);
        foreach($nextProjQuery as $nextProj):
            $nextProjMetaArr = unserialize($nextProj->meta_value);
            foreach ($nextProjMetaArr['slides'] as $npSlideArr){
                echo 'and..';
                if ( !in_array( $postCapabilityFilter, $npSlideArr['slideCap'] ) ){
                    echo 'not in it..';
                    //$next_post = get_previous_previous_post();
                    //filtered_next_post($next_post);
                }
            }
        endforeach;                        
        return $next_slug;
    }
}
$next_slug = filtered_next_post($next_post);
6
Zach Lysobey

Jetez un coup d'œil à get_previous_post() et get_next_post() et vous verrez qu'ils utilisent tous deux la get_adjacent_post() pour trouver le post précédent ou suivant.

Supposons que vous souhaitiez récupérer l'ID de la publication immédiatement précédente en fonction de l'ID de la publication actuelle. Voici ce que tu ferais:

function get_previous_post_id( $post_id ) {
    // Get a global post reference since get_adjacent_post() references it
    global $post;

    // Store the existing post object for later so we don't lose it
    $oldGlobal = $post;

    // Get the post object for the specified post and place it in the global variable
    $post = get_post( $post_id );

    // Get the post object for the previous post
    $previous_post = get_previous_post();

    // Reset our global object
    $post = $oldGlobal;

    if ( '' == $previous_post ) {
        return 0;
    }

    return $previous_post->ID;
}

Vous pouvez faire la même chose pour récupérer l'ID du prochain article ... et vous pouvez le faire de manière récursive si vous souhaitez obtenir le précédent article précédent:

$two_posts_ago = get_previous_post_id( get_previous_post_id( $post->ID ) );

TL; DR

get_previous_post() et get_next_post() font tous deux référence à un objet $post global pour effectuer leur sélection. Vous devez définir cet objet avant d'appeler l'une ou l'autre fonction, sinon ils ne sauront pas quelle publication utiliser comme référence pour next/previous.

La fonction d'encapsuleur ci-dessus configure simplement le $post global pour vous en fonction d'un ID transmis. Vous pourriez le faire renvoyer l'objet entier pour le message précédent plutôt que l'ID, c'est à vous de décider.

8
EAMann

Ici, vous pouvez obtenir une publication adjacente pour un type de publication spécifique avec une requête sql personnalisée et avec un filtre get_{$adjacent}_post_where où la valeur par défaut est précédente. Le résultat dépend également de $current_post_date et de l'opérateur de comparaison $op.

function bm_get_adjacent_post( $post_id, $author_id, $previous = 1 ) {
global $wpdb;

if ( ( ! $post = get_post( $post_id ) )  )
    return null;

$current_post_date = $post->post_date;

$adjacent = $previous ? 'previous' : 'next';
$op = $previous ? '<' : '>';
$order = $previous ? 'DESC' : 'ASC';

$where = apply_filters( "get_{$adjacent}_post_where", $wpdb->prepare( "WHERE  p.post_date $op %s AND p.post_type = %s AND p.post_status = 'publish' AND p.post_author = %d", $current_post_date, 'projects' , $author_id ), '', '' );
$sort  = apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1" );

$query = "SELECT p.ID FROM $wpdb->posts AS p $where $sort";
//echo $query;
$result = $wpdb->get_var( $query );
if ( null === $result )
    $result = '';
if ( $result )
    $result = get_post( $result );

return $result;
}
4
Mohan Dere