Проверка существования ЧПУ страницы и отображение её заголовка
Нашел эту функцию для проверки существования страницы по её ЧПУ (slug), и она отлично работает
function the_slug_exists($post_name) {
global $wpdb;
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return true;
} else {
return false;
}
}
но теперь мне нужно проверить существование страницы и вывести её заголовок, буду благодарен за помощь.
когда я размещаю этот код на странице для поиска ЧПУ:
<?php if (the_slug_exists('page-name')) {
echo '$post_title';
} ?>
всё работает отлично, кроме того, что мне нужно, чтобы функция выводила заголовок, а также проверяла ЧПУ, надеюсь, так понятнее.

При анализе MySQL-запроса в функции становится ясно, что хотя он сопоставляет post_name и возвращает true или false, вам нужно определить, существует ли страница по её слагу (slug). В этом случае выбранная вами функция не подходит.
Для получения страницы по заголовку можно просто использовать:
$page = get_page_by_title( 'Пример страницы' );
echo $page->title
Если же вам нужно получить страницу по слагу, можно использовать следующий код:
function get_page_title_for_slug($page_slug) {
$page = get_page_by_path( $page_slug , OBJECT );
if ( isset($page) )
return $page->post_title;
else
return "Совпадение не найдено";
}
Эту функцию можно вызвать следующим образом:
echo "<h1>" . get_page_title_for_slug("primer-stranicy") . "</h1>";
Дайте знать, если это поможет.

В общем, функции с префиксом the_
выводят результат, а функции с префиксом get_
возвращают его

так как мне вызвать эту функцию на странице, чтобы проверить существование этого слага и затем вывести заголовок страницы, которую я только что нашел?

Спасибо, Pieter. Я внес необходимые изменения. @JohnCarlos - я добавил вызов функции в конце своего ответа.

Что этот и другие ответы упускают, так это то, что функция get_page_by_path
делает буквально то, что заявлено. Если передать ей slug страницы с родительской страницей, она не сработает!. В этом случае нужно передавать родительский_slug/дочерний_slug
. Но все предполагают, что страницы не имеют родительских.

Почти всегда не рекомендуется использовать пользовательские SQL-запросы, когда в WordPress есть встроенные функции для выполнения конкретной задачи. Слаг или post_name
страницы также используется в пути (URL) страницы для идентификации и возврата её содержимого при посещении. Это означает, что мы можем использовать функцию get_page_by_path()
, просто передав слаг (post_name) в функцию, и получить объект страницы в ответ.
get_page_by_path (
string $page_path,
string $output = OBJECT,
string|array $post_type = 'page'
)
Как и многие другие функции и соглашения об именовании в WordPress (например, post_name
, который на самом деле является слагом, а не названием), имя функции get_page_by_path()
вводит в заблуждение и, по моему скромному мнению, неудачно, так как вы можете передать любой тип записи в эту функцию.
Мы можем использовать get_page_by_path()
, которая вернёт null
, если страница не найдена, или объект страницы в случае успеха. Давайте напишем правильную обёрточную функцию, которая будет возвращать false
при неудаче и всегда возвращать объект страницы, независимо от её существования.
function get_post_by_post_name( $slug = '', $post_type = '' )
{
// Убедимся, что у нас установлены значения для $slug и $post_type
if ( !$slug
|| !$post_type
)
return false;
// Мы не будем очищать ввод, так как get_page_by_path() сделает это
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return $post_object;
}
Затем вы можете использовать её следующим образом:
if ( function_exists( 'get_post_by_post_name' ) ) {
$post_object = get_post_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Выводим только если есть валидная запись
if ( $post_object ) {
echo apply_filters( 'the_title', $post_object->post_title );
}
}
Если вам действительно нужно получить только заголовок записи, мы можем немного изменить функцию:
function get_post_title_by_post_name( $slug = '', $post_type = '' )
{
// Убедимся, что у нас установлены значения для $slug и $post_type
if ( !$slug
|| !$post_type
)
return false;
// Мы не будем очищать ввод, так как get_page_by_path() сделает это
$post_object = get_page_by_path( $slug, OBJECT, $post_type );
if ( !$post_object )
return false;
return apply_filters( 'the_title', $post_object->post_title );
}
И использовать её так:
if ( function_exists( 'get_post_title_by_post_name' ) ) {
$post_title = get_post_title_by_post_name( 'post-name-better-known-as-slug', 'your_desired_post_type' );
// Выводим только если есть валидный заголовок
if ( $post_title ) {
echo $post_title;
}
}

Вот обновленная версия того же кода для вас
function the_slug_exists($post_name) {
global $wpdb;
//Санітизуємо заголовок
$post_name = sanitize_title($post_name);
if($wpdb->get_row("SELECT post_name FROM wp_posts WHERE post_name = '" . $post_name . "'", 'ARRAY_A')) {
return $post_name;
} else {
return false;
}
Затем вы можете запустить её, просто вызвав с помощью функции echo, как в следующем коде, который выведет название записи только если оно существует.
echo the_slug_exists($post_name);
ОБНОВЛЕНИЕ
В качестве альтернативы вы можете использовать стандартную условную функцию WordPress is_page(), тогда ваш код упростится до следующего вида..
if( is_page($post_name) ):
echo $post_name;
endif;

Как правило, функции с префиксом the_
выводят данные напрямую, а функции с префиксом get_
возвращают значения
