Я использую get_page_by_title
чтобы исключить несколько страниц из wp_list_pages
, мой код выглядит так:
<?php $page1 = get_page_by_title('title1'); $page2 = get_page_by_title('title2'); wp_list_pages("title_li=&exclude='.$page1->ID.','.$page2->ID.'") ?>
Этот код работает, но мне было интересно, есть ли способ объединить его, чтобы он был короче – что-то вроде:
<?php $pages = get_page_by_title(array('title1','title2')); wp_list_pages("title_li=&exclude='.$pages->ID.'") ?>
Это не сработало, но показалось, что это довольно близко … просто подумав, что код можно упростить.
Есть идеи?
Благодаря,
мистифицировать
Исходный код get_page_by_title()
показывает, что он запускает один запрос mysql. Вы можете оптимизировать ваши два вызова функции только одним запросом, написав пользовательский:
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);
Однако, я думаю, вы должны сделать его менее простым, добавив кэш к нему, чтобы уменьшить запрос базы данных _posts
для такой небольшой вещи:
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}");
и теперь, когда он длинный, я полагаю, что его обертывание в функции не повредит – помогите сохранить чистоту и помочь в повторном использовании:
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; }
Тогда вы могли просто сделать:
<?php $exclude = get_two_pages_ids_by_titles('title1','title2','listpages_exclude'); wp_list_pages("title_li=&exclude=".$exclude); ?>
Очевидно, get_two_pages_ids_by_titles
немного глупо и слишком специфично. Принятие массива титров и возврат одного из идентификаторов было бы лучше – но это должно помочь определить способ получения того, что вам нужно.
🎅🏻 Надеюсь, что это помогает.