Obține postările anterioare și următoare după ID-ul postării
Cum pot obține postările anterioare și următoare din afara loop-ului? Orice încerc să fac în afară de interogarea SELECT personalizată (folosind get_posts
sau WP_Query
) strică alte elemente pe pagină.
În prezent am o funcție recursivă care sper să găsească prima postare "anterioară" care îndeplinește o anumită condiție. Obțin prima valoare de test din get_previous_post()
dar nu știu cum să obțin 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 'și..';
if ( !in_array( $postCapabilityFilter, $npSlideArr['slideCap'] ) ){
echo 'nu este prezent..';
//$next_post = get_previous_previous_post();
//filtered_next_post($next_post);
}
}
endforeach;
return $next_slug;
}
}
$next_slug = filtered_next_post($next_post);

Aruncă o privire la get_previous_post()
și get_next_post()
și vei observa că ambele folosesc funcția get_adjacent_post()
pentru a găsi postarea anterioară sau următoare.
Să presupunem că vrei să obții ID-ul postării imediat anterioare bazat pe ID-ul postării curente. Iată ce ai putea face:
function get_previous_post_id( $post_id ) {
// Obține o referință globală la postare, deoarece get_adjacent_post() se bazează pe aceasta
global $post;
// Salvează obiectul postării existente pentru mai târziu, ca să nu-l pierdem
$oldGlobal = $post;
// Obține obiectul postării pentru ID-ul specificat și plasează-l în variabila globală
$post = get_post( $post_id );
// Obține obiectul postării anterioare
$previous_post = get_previous_post();
// Resetează obiectul global
$post = $oldGlobal;
if ( '' == $previous_post ) {
return 0;
}
return $previous_post->ID;
}
Poți face ceva similar pentru a obține ID-ul postării următoare... și poți face acest lucru recursiv dacă ai nevoie să obții postarea anterioară celei anterioare:
$two_posts_ago = get_previous_post_id( get_previous_post_id( $post->ID ) );
TL;DR
În esență, atât get_previous_post()
cât și get_next_post()
se referă la un obiect global $post
pentru a face selecția. Trebuie să configurezi acest obiect înainte de a apela oricare dintre aceste funcții, altfel ele nu vor ști ce postare să folosească ca referință pentru următoarea/anterioara.
Funcția wrapper de mai sus configurează automat obiectul global $post
pe baza unui ID trimis. Ai putea să o faci să returneze întregul obiect pentru postarea anterioară în loc de ID, depinde doar de tine.

Aceasta a fost de fapt abordarea cu care am început, dar din nu știu ce motiv totul se bloca când încercam să returnez $post
la $oldpost
. Fără erori, fără nicio indicație despre ce mergea greșit, doar o imagine GIF de încărcare care se învârtea. Probabil ceva ciudat în codul meu, dar nu am putut să-mi dau seama ce era greșit. Acum codul meu funcționează destul de bine, dar este un monstru de interogări SQL și mi-a luat câteva ore să-l pun la punct.

Aici poți obține postarea adiacentă pentru un anumit tip de postare folosind o interogare SQL personalizată și cu ajutorul filtrului
get_{$adjacent}_post_where
, unde valoarea implicită pentru adjacent este 'previous' (anterior). De asemenea, rezultatul depinde de $current_post_date
și de operatorul de comparație $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;
}

Iubesc acest răspuns găsit la: https://stackoverflow.com/a/33688032/2062851
function get_previous_post_id( $post_id ) {
// Obține o referință globală la post, deoarece get_adjacent_post() se referă la ea
global $post;
// Salvează obiectul post existent pentru mai târziu, ca să nu-l pierdem
$oldGlobal = $post;
// Obține obiectul post pentru ID-ul specificat și plasează-l în variabila globală
$post = get_post( $post_id );
// Obține obiectul post pentru postarea anterioară
$previous_post = get_previous_post();
// Resetează obiectul nostru global
$post = $oldGlobal;
if ( '' == $previous_post )
return 0;
return $previous_post->ID;
}
function get_next_post_id( $post_id ) {
// Obține o referință globală la post, deoarece get_adjacent_post() se referă la ea
global $post;
// Salvează obiectul post existent pentru mai târziu, ca să nu-l pierdem
$oldGlobal = $post;
// Obține obiectul post pentru ID-ul specificat și plasează-l în variabila globală
$post = get_post( $post_id );
// Obține obiectul post pentru postarea următoare
$next_post = get_next_post();
// Resetează obiectul nostru global
$post = $oldGlobal;
if ( '' == $next_post )
return 0;
return $next_post->ID;
}
apoi tot ce trebuie să faci este să apelezi funcția astfel:
echo get_previous_post_id( $current_id );
echo get_next_post_id( $current_id );
