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