web-dev-qa-db-fra.com

Comment obtenir les liens des articles suivants et précédents, alphabétiquement par titre, entre types d'articles, dans un shortcode

J'ai besoin des liens de publication précédents et suivants dans une page de publication unique en utilisant un type de système de gestion de contenu "constructeur de pages" - en particulier le thème DIVI de Elegant Themes . J'ai donc besoin que les liens apparaissent à l'aide de codes abrégés, car les contrôles du modèle, ainsi que de nombreux éléments de modèle par défaut, sont masqués lorsque vous utilisez le générateur de page. ET, mon client doit pouvoir savoir où, dans la mise en page, apparaissent les contrôles de publication suivants/précédents, en fonction du type de publication, car il s'agit d'un site de portfolio et les "sculptures" sont traitées avec une présentation différente de celle de "peintures", si ça a du sens.

Et j’ai besoin d’eux pour aller à la page suivante/précédente par ordre alphabétique plutôt que chronologique (par défaut).

Enfin, j'ai plusieurs types de publication personnalisés et ils ont tous besoin du même type de filtrage.

5
Will Lanni

Donc, pour ce faire, je devais filtrer les requêtes SQL. J'ai trouvé cet extrait qui filtre l'ordre de publication par titre et les renvoie pour les liens de publication suivants et précédents. Malheureusement, cela ne fonctionne pas dans un type d'article personnalisé. J'ai donc remplacé 'post' par get_post_type($post) pour récupérer le type de message actuel et le renvoyer. Cela permet ensuite à cela de fonctionner dans des types de publication personnalisés. ET, si vous le souhaitez, vous pouvez limiter ce nombre afin qu’il fonctionne UNIQUEMENT dans les types de publication personnalisés et non dans les publications de blog. Je n'ai pas fait ça ici, mais c'est possible. Voici le code que j'ai mis dans mon functions.php:

function filter_next_post_sort($sort) {
    $sort = "ORDER BY p.post_title ASC LIMIT 1";
    return $sort;
}
function filter_next_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title > '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

function filter_previous_post_sort($sort) {
    $sort = "ORDER BY p.post_title DESC LIMIT 1";
    return $sort;
}
function filter_previous_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title < '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

add_filter('get_next_post_sort',   'filter_next_post_sort');
add_filter('get_next_post_where',  'filter_next_post_where');

add_filter('get_previous_post_sort',  'filter_previous_post_sort');
add_filter('get_previous_post_where', 'filter_previous_post_where');

Ensuite, j'ai mis en place un couple de raccourcis pour pouvoir ajouter les liens suivants et précédents. Parce que le thème que j'utilise devient vicieux s'il ne renvoie rien (et que le premier et le dernier message ne renverront rien pour les liens du précédent et du suivant, respectivement), je devais retourner un espace vide:

function next_shortcode($atts) {
    global $post;
    ob_start(); 
    next_post_link( '<div class="nav-next">%link</div>', 'Next Work <span class="arrow_carrot-right_alt2"></span>' );              
    $result = ob_get_contents();
    ob_end_clean();
    $result = (!$result ? '<div class="nav-next">&nbsp;</div>' : $result);
    return $result;
}

function prev_shortcode($atts) {
    global $post;
    ob_start();
    previous_post_link( '<div class="nav-previous">%link</div>', '<span class="arrow_carrot-left_alt2"></span> Previous Work' );              
    $result = ob_get_contents();
    ob_end_clean();
    $result = (!$result ? '<div class="nav-previous">&nbsp;</div>' : $result);
    return $result;
}
add_shortcode( 'prev_work', 'prev_shortcode' );
add_shortcode( 'next_work', 'next_shortcode' );

Notez que j'utilise la police élégante des icônes de Elegant Themes. C'est donc à cela que sert le <span> avec la classe arrow_carrot-left/right_alt2.

Quoi qu'il en soit, espérons que cela aide quelqu'un d'autre!

6
Will Lanni