Je travaille sur un type de publication personnalisé trié sur un champ personnalisé. Pas de problème quand je liste les messages. Mais lorsque je vais à la page d'article unique pour l'un d'entre eux, je souhaite que les liens de navigation Précédent et Suivant nous mènent aux articles précédents/suivants dans l'ordre de tri défini par le champ personnalisé. Par défaut, WP les ordonne par date d'envoi.
Code pour la liste de tri:
// shortcodes
// lor_list of letters: Lists all letters of reference in a table format
add_shortcode('lor_list', 'aaaConsultant_shortcode_lor_list');
function aaaConsultant_shortcode_lor_list() {
global $wp_query;
$oWP = new wp_query(array(
'post_type' => 'letters_of_ref'
, 'orderby' => 'meta_value'
, 'meta_key' => 'aaaConsultant_dateofletter'
));
$out = '<div id="lor_list_container">' . "\n";
if (!$oWP->found_posts) {
$out .= '<p>d\'Oh! We don\'t have any Letters of Reference yet.</p>' . "\n";
} else {
while ($oWP->have_posts()) {
$oWP->the_post();
$out .= '<a href="' . get_permalink() . '">' . get_the_title( $oWP->post->ID ) . '</a>' . "<br>\n";
}
}
$out .= '</div> <!-- END #lor_list_container -->' . "\n";
wp_reset_postdata();
return $out;
}
Comment je fais ça?
Merci de votre aide.
Pour que les liens des publications précédentes et suivantes fonctionnent, vous devez vous connecter aux filtres get_*_post_*
et modifier la requête pour trier les publications à l'aide de votre champ personnalisé. J'espère que le code ci-dessous fonctionnera pour vous.
Pour le post précédent lien
add_filter('get_previous_post_join', 'wpse96670_get_previous_post_join_custom_sort');
add_filter('get_previous_post_where', 'wpse96670_get_previous_post_where_custom_sort');
add_filter('get_previous_post_sort', 'wpse96670_get_previous_post_sort_custom_sort');
function wpse96670_get_previous_post_join_custom_sort($join) {
global $wpdb;
return "INNER JOIN {$wpdb->prefix}postmeta ON (p.ID = {$wpdb->prefix}postmeta.post_id)";
}
function wpse96670_get_previous_post_where_custom_sort($where) {
global $wpdb, $post;
$meta_value = get_post_meta($post->ID, 'aaaConsultant_dateofletter', true);
return "WHERE 1=1 AND p.post_type = 'letters_of_ref' AND p.post_status = 'publish' AND {$wpdb->prefix}postmeta.meta_key = 'aaaConsultant_dateofletter' AND {$wpdb->prefix}postmeta.meta_value < '{$meta_value}'";
}
function wpse96670_get_previous_post_sort_custom_sort($sort) {
global $wpdb;
return "ORDER BY {$wpdb->prefix}postmeta.meta_value DESC LIMIT 1";
}
Pour le lien suivant
add_filter('get_next_post_join', 'wpse96670_get_next_post_join_custom_sort');
add_filter('get_next_post_where', 'wpse96670_get_next_post_where_custom_sort');
add_filter('get_next_post_sort', 'wpse96670_get_next_post_sort_custom_sort');
function wpse96670_get_next_post_join_custom_sort($join) {
global $wpdb;
return "INNER JOIN {$wpdb->prefix}postmeta ON (p.ID = {$wpdb->prefix}postmeta.post_id)";
}
function wpse96670_get_next_post_where_custom_sort($where) {
global $wpdb, $post;
$meta_value = get_post_meta($post->ID, 'aaaConsultant_dateofletter', true);
return "WHERE 1=1 AND p.post_type = 'letters_of_ref' AND p.post_status = 'publish' AND {$wpdb->prefix}postmeta.meta_key = 'aaaConsultant_dateofletter' AND {$wpdb->prefix}postmeta.meta_value > '{$meta_value}'";
}
function wpse96670_get_next_post_sort_custom_sort($sort) {
global $wpdb;
return "ORDER BY {$wpdb->prefix}postmeta.meta_value ASC LIMIT 1";
}
Ensuite, vous avez besoin de code dans le modèle:
<?php
$oNext = get_adjacent_post(false, '', true);
$oPrev = get_adjacent_post(false, '', false);
if ($oPrev || $oNext) {
echo '<div id="lor_nav">' . "\n";
}
if ($oPrev) {
echo '<div class="prevlink"><a href="' . get_permalink($oPrev->ID) . '"> « ' . $oPrev->post_title . '</a></div>' . "\n";
}
if ($oNext) {
echo '<div class="nextlink"><a href="' . get_permalink($oNext->ID) . '">' . $oNext->post_title . ' »</a></div>' . "\n";
}
if ($oPrev || $oNext) {
echo '</div><div class="clear"></div>' . "\n";
}
?>
Faites-moi savoir si vous avez besoin de clarification.