Проверка существования ЧПУ страницы и отображение её заголовка

17 мар. 2016 г., 03:23:58
Просмотры: 25.4K
Голосов: 0

Нашел эту функцию для проверки существования страницы по её ЧПУ (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';
} ?>

всё работает отлично, кроме того, что мне нужно, чтобы функция выводила заголовок, а также проверяла ЧПУ, надеюсь, так понятнее.

1
Комментарии

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

Pieter Goosen Pieter Goosen
17 мар. 2016 г. 06:28:00
Все ответы на вопрос 3
4

При анализе 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>";

Дайте знать, если это поможет.

17 мар. 2016 г. 05:11:52
Комментарии

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

Pieter Goosen Pieter Goosen
17 мар. 2016 г. 06:27:54

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

John Carlos John Carlos
17 мар. 2016 г. 06:50:05

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

Prasad Nevase Prasad Nevase
17 мар. 2016 г. 10:47:08

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

NextGenThemes NextGenThemes
25 июн. 2020 г. 20:27:28
1

Почти всегда не рекомендуется использовать пользовательские 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;
    }
}
17 мар. 2016 г. 09:46:51
Комментарии

Не работает, у меня есть страница с указанным slug, но функция возвращает false.

NextGenThemes NextGenThemes
25 июн. 2020 г. 20:17:52
2

Вот обновленная версия того же кода для вас

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;
17 мар. 2016 г. 04:40:51
Комментарии

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

Pieter Goosen Pieter Goosen
17 мар. 2016 г. 06:27:07

похоже, это просто выводит slug записи 'post_name', тогда как мне нужно выводить post_title, а проверка is_page будет работать только если я нахожусь именно на этой странице, а не для проверки её существования

John Carlos John Carlos
17 мар. 2016 г. 06:44:26