i need a function to display the next and previous post (title, permalink, date, content) in single.php
next and previous post must have the same meta_key and the same meta_value of the current post
the function could be something like that
my_adjacent_post($order=ASC, $meta_key, $meta_value)
--------------------------------------------------------------
<strong>EDIT</strong>
i have found the solution :-)
I wrote this function :
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// fonction pour afficher la navigation vers l'article suivant ou précedent en fonction de sa meta_value et sa meta_key
// sebastien | french wordpressdesigner | [email protected]
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function my_adjacent_post($meta_key, $meta_value , $nextprev = 'next' ){
global $post;
$date = $post->post_date;
global $wpdb;
if($nextprev == 'next' ) {
$sign = '>';
$order= 'ASC';
}
elseif($nextprev == 'prev' ) {
$sign = '<';
$order= 'DESC';
}
$querystr = "
SELECT $wpdb->posts.*
FROM $wpdb->posts, $wpdb->postmeta
WHERE $wpdb->posts.ID = $wpdb->postmeta.post_id
AND $wpdb->postmeta.meta_key = '".$meta_key."'
AND $wpdb->postmeta.meta_value = '".$meta_value."'
AND $wpdb->posts.post_status = 'publish'
AND $wpdb->posts.post_date ".$sign." '".$date."'
ORDER BY $wpdb->posts.post_date ".$order."
LIMIT 1";
$postData = $wpdb->get_results($querystr, OBJECT);
//print_r($postData);
if(empty($postData)) {
echo "this array is empty, i could use a default content.";
} else {
foreach($postData as $article) {
$list = "this is the ".$nextprev." post";
$list .= "<BR>ID : ";
$list .= $article->ID;
$list .= "<BR>url : ";
$list .= get_permalink($article->ID);
$list .= "<BR>title : ";
$list .= $article->post_title;
$list .= "<BR>date : ";
$list .= $article->post_date;
echo $list;
}
}
}
and the function to use :
$meta_key = 'brand';
$meta_value = 'SONY';
echo "prev : ";
my_adjacent_post($meta_key,$meta_value,'prev');
echo "next : ";
my_adjacent_post($meta_key,$meta_value,'next');
Abdelhadi Touil answers:
Hi.
Wordpress has a built in function that displays next and previous posts:
[[LINK href="http://codex.wordpress.org/Next_and_Previous_Links"]]http://codex.wordpress.org/Next_and_Previous_Links[[/LINK]]
what do you want exactly?
Sébastien | French WordpressDesigner comments:
the simply way : read my question
Abdelhadi Touil comments:
Do you think I didn't read your question? Actully I'v read it but I'd like to have more explination. Hope others help you. Good luck.
Arnav Joy answers:
tyrtry this
functions.php
<?php
function my_adjacent_post($postID , $meta_key, $meta_value , $nextprev ){
global $wpdb;
if($nextprev == 'next' )
$sign = '>';
else
$sign = '<';
$querystr = "SELECT wposts.ID,wposts.post_title FROM $wpdb->posts wposts LEFT JOIN $wpdb->postmeta wpostmeta ON wposts.ID = wpostmeta.post_id WHERE wposts.ID ".$sign." ".$postID." AND wpostmeta.meta_key = '".$meta_key."'
AND wpostmeta.meta_value = '".$meta_value."' AND wposts.post_status = 'publish' ";
$postData = $wpdb->get_results($querystr, OBJECT);
if(!empty($postData)){
foreach($postData as $pData)
$postArr[] = get_permalink($pData->ID);
$postArr[] = $pData->post_title;
return '<a href="'.$postArr[0].'">'.$postArr[1].'</a>';
}
}
?>
then call it as
<?php
$meta_key = 'mail_order';
$meta_value = 'test';
my_adjacent_post(get_the_ID(),$meta_key,$meta_value,'next');
my_adjacent_post(get_the_ID(),$meta_key,$meta_value,'prev');
?>
Sébastien | French WordpressDesigner comments:
i have test with my meta value and my meta key, but the array $postData return an empty array.
Arnav Joy comments:
change this line
return '<a href="'.$postArr[0].'">'.$postArr[1].'</a>';
to
echo '<a href="'.$postArr[0].'">'.$postArr[1].'</a>';
Sébastien | French WordpressDesigner comments:
that is not the problem
$postData is empty
print_r($postData) return an empty array
Arnav Joy comments:
Have you checked that the other post hasve same meta key and and same meta value as the current post
i have three post with the ID as follows
1706
1716 ----> current visiting post
1721
so all the three posts have same meta key and same meta values
meta_key = 'mailer_order'
meta_value = 'test'
and when i visited post 1716 then it gives me
prev post=> 1706
next post => 1721
please check and let me know
Sébastien | French WordpressDesigner comments:
i have 4 posts with the meta_key "brand" and the meta_value "DIESEL"
in my single.php i write :
$meta_key = 'marque';
$meta_value = 'DIESEL';
my_adjacent_post(get_the_ID(),$meta_key,$meta_value,'next');
my_adjacent_post(get_the_ID(),$meta_key,$meta_value,'prev');
but nothing is displayed.
I add in your function :
if(empty($postData)) {echo "this array is empty";}
and the output on my site is :
this array is emptythis array is empty
Arnav Joy comments:
you posts status are 'published' ?
Sébastien | French WordpressDesigner comments:
absolutely
Sébastien | French WordpressDesigner comments:
and i use wp 3.4.1
Sébastien | French WordpressDesigner comments:
and you ?
Arnav Joy comments:
same.
Sébastien | French WordpressDesigner comments:
ok, i have find my mistake
the value must be an ID and not the name of the brand, sorry for this confusion.
So, your function is ok.
But there is a problem. If the url is ok, the label of the link is wrong.
and if the label is ok, the url is wrong
Arnav Joy comments:
change this
$postArr[] = get_permalink($pData->ID);
$postArr[] = $pData->post_title;
to
$postArr[] = get_permalink($pData->ID);
$postArr[] = get_the_title($pData->ID); // this lijne is modified
Sébastien | French WordpressDesigner comments:
don't work
one time the output is the title, one time the output in an url...
Sébastien | French WordpressDesigner comments:
probable you must change the order (asc/desc) if it's next OR prev, no ??
and add a LIMIT = 1 to have a light request, no ?
Sébastien | French WordpressDesigner comments:
i feel that posts are sorted by ID in you request... no ?
Posts must be sorted by date of course.
Sébastien | French WordpressDesigner comments:
in fact i need just a request to display the next post (date) which have a specific meta_value and a specific meta_key
and the previous post (date) which have a specific meta_value and a specific meta_key :-)
Arnav Joy comments:
here is the updated function , please check it
<?php
function my_adjacent_post($postID , $meta_key, $meta_value , $nextprev ){
global $wpdb;
if($nextprev == 'next' )
$sign = '>';
else
$sign = '<';
$querystr = "SELECT wposts.ID,wposts.post_title FROM $wpdb->posts wposts LEFT JOIN $wpdb->postmeta wpostmeta ON wposts.ID = wpostmeta.post_id WHERE wposts.ID ".$sign." ".$postID." AND wpostmeta.meta_key = '".$meta_key."'
AND wpostmeta.meta_value = '".$meta_value."' AND wposts.post_status = 'publish' ";
$postData = $wpdb->get_results($querystr, OBJECT);
if(!empty($postData)){
$i = 0;
foreach($postData as $pData) {
$postArr[$i++] = get_permalink($pData->ID);
$postArr[$i] = $pData->post_title;
echo '<a href="'.$postArr[0].'">'.$postArr[1].'</a>';
return;
}
}
}
?>
Sébastien | French WordpressDesigner comments:
thank you very much but your function sorts the posts by id not by date.
I have edited my question because i have found the solution. You can read my function in my edit.
Thanx