web-dev-qa-db-fra.com

Personnalisation du type de publication sur un champ personnalisé

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.

1
NotoriousWebmaster

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) . '"> &laquo; ' . $oPrev->post_title . '</a></div>' . "\n";
        }
        if ($oNext) {
            echo '<div class="nextlink"><a href="' . get_permalink($oNext->ID) . '">' . $oNext->post_title . ' &raquo;</a></div>' . "\n";
        }
        if ($oPrev || $oNext) {
            echo '</div><div class="clear"></div>' . "\n";
        }
?>

Faites-moi savoir si vous avez besoin de clarification.

3
Hameedullah Khan