get_page_by_title()
Получает запись (страницу, пост, произвольный тип записи) по переданному заголовку записи. Делает прямой запрос в БД.
С версии WP 6.2 функция get_page_by_title() была упразднена!
Теперь рекомендуется использовать WP_Query (#57041) или get_posts().
Зачем это нужно? Из-за ограничений, связанных с запросом к БД get_page_by_title() может возвращать разные результаты в зависимости от версии базы данных и/или используемого движка. Переход на WP_Query обеспечит получение одинаковых результатов независимо от настроек вашего сервера.
Однако, надо иметь ввиду, что в отличие от get_page_by_title(), WP_Query может быть использован только во время события plugins_loaded или позже.
Чтобы получить эквивалентный запрос к базе данных через WP_Query, можно использовать следующие аргументы.
$query = new WP_Query( [ 'post_type' => 'page', 'title' => 'Sample Page', 'post_status' => 'all', 'posts_per_page' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', // get_post like 'no_found_rows' => true, 'ignore_sticky_posts' => true, ] ); if ( ! empty( $query->post ) ) { $page_got_by_title = $query->post; } else { $page_got_by_title = null; }
Того же результата можно добиться и с помощью get_posts(). В этом случае вы можете заменить код на следующий:
$posts = get_posts( [ 'post_type' => 'page', 'title' => 'Sample Page', 'post_status' => 'all', 'posts_per_page' => 1, 'update_post_term_cache' => false, 'update_post_meta_cache' => false, 'orderby' => 'post_date ID', 'order' => 'ASC', ] ); if ( ! empty( $posts ) ) { $page_got_by_title = $posts[0]; } else { $page_got_by_title = null; }
Обеспечение доступности страницы
Из-за прямого запроса к БД, который делается в get_page_by_title(), может получится так, что страница найдена, но юзер не имеет доступа к этой странице и ссылка страницу будет показывать страницу 404 Page Not Found.
Приведенный выше код воспроизводит такое поведение. Если вы хотите избежать этой проблемы, то не указывайте параметр post_status=all в приведенном выше коде.
Подробнее: https://make.wordpress.org/core/2023/03/06/get_page_by_title-deprecated/
Если найдено несколько записей с одинаковым заголовком, то будет возращена запись с меньшим ID.
Запись какого типа нужно получить указывается в третьем параметре $post_type. По умолчанию заголовок будет искаться у "постоянных страниц" (page).
Так как функция использует сравнение MySQL '=', заголовок чаще всего не чувствителен к регистру, зависит от настроек MySQL.
Если нужно получить ID по УРЛ, используйте специальную функцию: url_to_postid().
Прежде чем использовать эту функцию обдумайте как она будет работать. Имейте ввиду, что запрос создаваемый этой функций не такой легкий, как например получение записи по ID. Функция ищет совпадения в таблице по неиндексированному столбцу, поэтому ей придется проверить все строки совпадающие с типом записи. Поэтому тут по умолчанию стоит тип page, обычно там не более 50 записей.
Хуков нет.
Возвращает
WP_Post|Массив|null
.
-
WP_Post - Объект поста.
-
Массив
- при $output = ARRAY_N или ARRAY_A. Данные возвращаемого массива полностью совпадают с полями таблицы wp_posts. null
- если запись не была найдена.
Использование
get_page_by_title( $page_title, $output, $post_type );
- $page_title(строка) (обязательный)
- Заголовок записи (поста, страницы) данные которой нужно получить.
- $output(строка)
Формат вывода найденной записи. Может быть:
- OBJECT - возвращать как объект;
- ARRAY_N - возвращать как нумерованный массив;
- ARRAY_A - возвращать как ассоциативный массив.
По умолчанию: OBJECT
- $post_type(строка/массив)
- Название типа поста. Для постов это 'post'. Можно указать несколько типов в массиве: array('post', 'page');.
По умолчанию: 'page'
Примеры
#1 Получим данные страницы
Есть страница с заголовком "О сайте". Нам нужно получить объект данных этой страницы (все данные строки таблицы wp_posts в базе данных):
$ppp = get_page_by_title('О сайте'); /* $ppp будет содержать: WP_Post Object ( [ID] => 7 [post_author] => 1 [post_date] => 2010-03-28 15:31:00 [post_date_gmt] => 2010-03-28 11:31:00 [post_content] => Контент записи. Обычно тут много написано :) [post_title] => О сайте / Об авторе [post_excerpt] => [post_status] => publish [comment_status] => open [ping_status] => closed [post_password] => [post_name] => about [to_ping] => [pinged] => [post_modified] => 2014-04-21 01:23:20 [post_modified_gmt] => 2014-04-20 21:23:20 [post_content_filtered] => [post_parent] => 0 [guid] => http://wp-kama.ru/about [menu_order] => 0 [post_type] => page [post_mime_type] => [comment_count] => 116 [filter] => raw ) */
Получив объект поста мы можем узнать разные данные записи. Например, так мы можем узнать ID записи по заголовку:
$ppp = get_page_by_title('О сайте'); echo $ppp->ID; // ID записи echo $ppp->post_content; // контент записи
#2 Исключим страницу из списка по заголовку
Предположим мы выводим в меню страницы. Но нам не нужно выводить в это меню страницу с заголовком "Контакты". Исключаем так:
<?php $page = get_page_by_title( 'Контакты' ); wp_list_pages( 'exclude=' . $page->ID ); ?>
Заметки
- Global. wpdb. $wpdb WordPress database abstraction object.
Список изменений
С версии 2.1.0 | Введена. |
С версии 3.0.0 | The $post_type parameter was added. |
Устарела с 6.2.0 | Use WP_Query. |