WordPress как на ладони
rgbcode is looking for WordPress developers. Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

get_page_by_title()WP 2.1.0

Устарела с версии 6.2.0. Больше не поддерживается и может быть удалена. Используйте WP_Query.

Получает запись (страницу, пост, произвольный тип записи) по переданному заголовку записи. Делает прямой запрос в БД.

С версии 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 записей.

1 раз — 0.0015 сек (очень медленно) | 50000 раз — 19.42 сек (медленно) | PHP 7.0.2, WP 4.4.1

Хуков нет.

Возвращает

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'

Примеры

0

#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; // контент записи
0

#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.

Код get_page_by_title() WP 6.4.3

function get_page_by_title( $page_title, $output = OBJECT, $post_type = 'page' ) {
	_deprecated_function( __FUNCTION__, '6.2.0', 'WP_Query' );
	global $wpdb;

	if ( is_array( $post_type ) ) {
		$post_type           = esc_sql( $post_type );
		$post_type_in_string = "'" . implode( "','", $post_type ) . "'";
		$sql                 = $wpdb->prepare(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_title = %s
			AND post_type IN ($post_type_in_string)",
			$page_title
		);
	} else {
		$sql = $wpdb->prepare(
			"SELECT ID
			FROM $wpdb->posts
			WHERE post_title = %s
			AND post_type = %s",
			$page_title,
			$post_type
		);
	}

	$page = $wpdb->get_var( $sql );

	if ( $page ) {
		return get_post( $page, $output );
	}

	return null;
}
2 комментария
    Войти