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
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.