web-dev-qa-db-fra.com

Combinez get_page_by_title pour exclure des pages de wp_list_pages

J'utilise get_page_by_title pour exclure quelques pages de wp_list_pages, mon code ressemble à ceci:

<?php
    $page1 = get_page_by_title('title1');
    $page2 = get_page_by_title('title2');
    wp_list_pages("title_li=&exclude='.$page1->ID.','.$page2->ID.'")
?>

Ce code fonctionne, mais je me demandais s’il existait un moyen de le combiner afin qu’il soit plus court - quelque chose comme:

<?php
    $pages = get_page_by_title(array('title1','title2'));
    wp_list_pages("title_li=&exclude='.$pages->ID.'")
?>

Cela n'a pas fonctionné, mais je me suis dit que c'était assez proche ... pensant simplement que le code pourrait être un peu simplifié.

Des idées?

Merci,
Josh

1
Josh Rodgers

get_page_by_title() le code source indique qu'il exécute une seule requête mysql. Vous pouvez rationaliser vos deux appels de la fonction pour qu’ils ne soient qu’une requête en écrivant une requête personnalisée:

global $wpdb;

$qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = 'publish'";
$sql = $wpdb->prepare($qry, 'title1', 'title2' );
$res = $wpdb->get_results( $sql );

$getIDs = array();
foreach ($res as $result)
    $getIDs[] = $result->ID;

$exclude = implode(',', $getIDs);

Cependant, je pense que vous devriez simplifier les choses en y ajoutant un cache afin de réduire la requête de base de données de _posts pour une si petite chose:

global $wpdb;

if ( false === ( $exclude = get_transient( 'myplugin_exclude' ) ) ) {
    $qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = 'publish'";
    $sql = $wpdb->prepare($qry, 'title1', 'title2' );
    $res = $wpdb->get_results( $sql );

    $getIDs = array();
    foreach ($res as $result)
        $getIDs[] = $result->ID;

    $exclude = implode(',', $getIDs);
    set_transient( 'myplugin_exclude', $exclude, 60*60*24 ); // once a day
}

wp_list_pages("title_li=&exclude={$exclude}");

et maintenant que c'est long, je suppose que l'envelopper dans une fonction ne ferait pas de mal - aidez à garder les choses propres et aidez-les à être réutilisables:

function get_two_pages_ids_by_titles($title1,$title2,$name) {
    global $wpdb;

    if ( false === ( $exclude = get_transient( $name ) ) ) {
        $qry = "SELECT ID FROM $wpdb->posts WHERE (post_title = %s OR post_title = %s) AND post_status = 'publish'";
        $sql = $wpdb->prepare($qry, $title1, $title2 );
        $res = $wpdb->get_results( $sql );

        $getIDs = array();
        foreach ($res as $result)
            $getIDs[] = $result->ID;

        $exclude = implode(',', $getIDs);
        set_transient( $name, $exclude, 60*60*24 ); // once a day
    }
    return $exclude;
}

Ensuite, vous pouvez simplement faire:

<?php
    $exclude = get_two_pages_ids_by_titles('title1','title2','listpages_exclude');
    wp_list_pages("title_li=&exclude=".$exclude);
?>

De toute évidence, get_two_pages_ids_by_titles est un peu bête et trop spécifique. Accepter un éventail de titres et renvoyer l'un des identifiants serait préférable - mais cela devrait aider à trouver le moyen d'obtenir ce que vous recherchez.

???????? J'espère que cela pourra aider.

0
David Sword