Intereting Posts
Запретить выбранные условия подниматься до вершины что такое имя_параметра в базе данных, которое хранит информацию о текущем виджет-инициаторе в боковой панели frontend? Функция разделения «the_tags» в 2 столбцах Проблемы с DBDelta с ключом FOREIGN? Дополнительные поля и загрузка мультимедиа Загрузить сценарий только на странице администратора Добавление бита 'style =' к выводу image_send_to_editor Ускорить MU WordPress на Apache VPS? Пользовательский таксономический фильтр для СМИ Как правильный стиль списка отображается в firefox? Отфильтровать содержимое из сообщения в глобальном масштабе сразу после того, как он получен из базы данных Как правильно экспортировать / импортировать базу данных WordPress (MySQL) через командную строку? Шаблоны страниц не работают, несмотря на правильность ссылок Как я могу увидеть значение varibles при запуске моего плагина? предотвращать появление подкатегорий

Объединить get_page_by_title, чтобы исключить страницы из wp_list_pages

Я использую 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 немного глупо и слишком специфично. Принятие массива титров и возврат одного из идентификаторов было бы лучше – но это должно помочь определить способ получения того, что вам нужно.

🎅🏻 Надеюсь, что это помогает.