get_page_by_path() WP 2.1.0

Отримує запис за вказаним шляхом цієї сторінки: parent-page/sub-page . Результат кешується.

Можна вказати ярлик (ім’я, post_name, slug) для не деревоподібних типів записів. Тобто. так можна отримати пост на ім’я.

Можна вказати з яким типом запису працювати за промовчанням page.

Для деревоподібних типів записів у перший параметр потрібно вказати повний шлях! Наприклад, якщо вказати тільки slug і це дочірня сторінка, функція не знайде сторінку. Наприклад, запис такої URL /parent_name/child_name, якщо вказати тільки ім’я child_name, то функція не знайде пост.

Ця функція є основою розпізнавання поточного запиту для постійних сторінок з урахуванням ЧПУ: запитів виду: index.php?pagename=parent-page/sub-page.

Щоб отримати запис за заголовком, використовуйте get_page_by_title()

1 раз – 0.000868 сек
(повільно) | 50000 разів – 0.59 сек
(дуже швидко) |
PHP 7.1.2, WP 4.7.3

Хуків немає.

Повертає

WP_Post|Массив|null.

  • WP_Post або масив за успіху.
  • null за помилки.

Використання

get_page_by_path ($ page_path, $ output, $ post_type);
$page_path
(рядок) (обов’язковий)
Шлях сторінки, для не деревоподібних записів можна вказати ярлик (slug). Слеші
/на кінцях зрізуються.
$output
(рядок)

В якому вигляді потрібно отримати результат:

  • OBJECT – повертати як об’єкт;
  • ARRAY_N – повертати як нумерований масив;
  • ARRAY_A – повертати як асоціативний масив.

Типово: OBJECT

$post_type
(рядок/масив)

Назва типу запису. Для сторінок це ‘page’.

  • Якщо вказати кілька типів записів або один у масиві: [‘post’, ‘page’] або [‘post’] , то пошук буде вестися саме за вказаними типами записів.
  • Якщо вказати тип запису у вигляді рядка, то до нього буде додано тип запису attachment.

За замовчуванням: ‘page’ (згодом стає ‘page, attachment’)

Приклади

0

#1 Отримаємо сторінку її шляхом

Припустимо, у нас є дочірня сторінка, до якої ми звертаємося за URL example.com/parent-page/sub-page: parent-page/sub-page – це шлях сторінки. Тепер десь у коді отримаємо цю сторінку.

$page = get_page_by_path( 'parent-page/sub-page');

// або так
$page = get_page_by_path('/parent-page/sub-page/');

print_r ($ page);

ВАЖЛИВО! Якщо просто вказати ім’я сторінки, то функція нічого не поверне

$page = get_page_by_path( 'sub-page'); //> NULL

Однак, якщо сторінка не дочірня, потрібно вказувати просто ім’я сторінки – ярлик (slug).

$page = get_page_by_path( 'page-name' ); //> WP_Post{...}
0

#2 Використання нових типів записів

Є новий тип запису, шлях до такого запису, зазвичай втілений назвою типу запису. Наприклад, тип запису називається car , URL конкретного запису: example.com/car/lada. Щоб отримати такий запис, потрібно використовувати лише його ярлик:

// Правильний варіант
$page = get_page_by_path('lada', OBJECT, 'car');

// НЕ правильний (нічого не поверне)
$page = get_page_by_path('car/lada', OBJECT, 'car');
Авто-додавання типу attachment
// запит буде: post_type IN ( 'car', 'attachment' )
$page = get_page_by_path('lada', OBJECT, 'car');

// запит буде: post_type IN ( 'car')
$page = get_page_by_path( 'lada', OBJECT, ['car'] );
Отримання останній частині шляху

Щоб отримати останню частину шляху можна використовувати функції basename() і untrailingslashit() :

$page_path = 'car/lada/';
$post_name = basename( untrailingslashit( $page_path ) );
$page = get_page_by_path( $post_name , OBJECT, 'car');

нотатки

  • Global. wpdb. $wpdb WordPress database abstraction object.

список змін

З версії 2.1.0Введено.

Код get_page_by_path() WP 6.0.2

function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) {
	Global $wpdb;

	$last_changed = wp_cache_get_last_changed( 'posts' );

	$hash = md5( $page_path . serialize( $post_type ) );
	$cache_key = "get_page_by_path:$hash:$last_changed";
	$ cached = wp_cache_get ($ cache_key, 'posts');
	if ( false !== $cached ) {
		// Special case: '0' is a bad `$page_path`.
		if ( '0' === $cached || 0 === $cached ) {
			return;
		} else {
			return get_post ($ cached, $ output);
		}
	}

	$ page_path = rawurlencode (urldecode ($ page_path));
	$page_path = str_replace( '%2F', '/', $page_path );
	$page_path = str_replace( '%20', '', $page_path );
	$parts = explode( '/', trim( $page_path, '/' ) );
	$ parts = array_map ( 'sanitize_title_for_query', $ parts );
	$escaped_parts = esc_sql($parts);

	$in_string = "'" . implode( "','", $escaped_parts ) . "'";

	if ( is_array( $post_type ) ) {
		$post_types = $post_type;
	} else {
		$post_types = array( $post_type, 'attachment');
	}

	$post_types = esc_sql($post_types);
	$post_type_in_string = "'" . implode("','", $post_types). "'";
	$sql = "
		SELECT ID, post_name, post_parent, post_type
		FROM $wpdb->posts
		WHERE post_name IN ($in_string)
		AND post_type IN ($post_type_in_string)
	";

	$pages = $wpdb->get_results( $sql, OBJECT_K );

	$ revparts = array_reverse ($ parts);

	$ foundid = 0;
	foreach ((array) $pages as $page) {
		if ( $page->post_name == $revparts[0] ) {
			$ count = 0;
			$p = $page;

			/*
			 * Loop через given path parts from right to left,
			 * обмикаючи всі матчі до post ancestry.
			 */
			while ( 0 != $p->post_parent && isset( $pages[ $p->post_parent ] ) ) {
				$ count++;
				$parent = $pages[$p->post_parent];
				if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) {
					break;
				}
				$p = $parent;
			}

			if ( 0 == $p->post_parent && count( $revparts ) == $count + 1 && $p->post_name == $revparts[ $count ] ) {
				$foundid = $page->ID;
				if ( $page->post_type == $post_type ) {
					break;
				}
			}
		}
	}

	// We cache misses as well as hits.
	wp_cache_set ($ cache_key, $ foundid, 'posts');

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

	return null;
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *