Intereting Posts
цитирует проблему в очень простом sql Использование скрипта TinyMCE для фильтра узлов для добавления атрибута id в привязки получить все сообщения, связанные с пользовательской таксономией Добавление якорей в меню WordPress Постоянная ссылка арабского на главную страницу Динамическая навигационная панель боковой панели с текущей подсветкой страницы Автоматически удалять сообщения на основе запроса Использовать значение по умолчанию для wp_customizer в выводе theme_mod? Как преобразовать аргумент wp_list_pages в массив генерировать уникальный слизнь при вставке сообщения Количество должностей для каждого таксономического термина за каждый месяц <p> тег прерывает вывод короткого кода (другие решения не работают) Добавление нового значения в существующий мета ключ Ограничьте количество слов, отображаемых плагином последних новостей, или порекомендуйте альтернативный Могу ли я оставить `if (! Defined …)` при определении констант плагина?

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

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