Получить текущий тип страницы

31 янв. 2013 г., 08:00:19
Просмотры: 27.8K
Голосов: 5

Существует ли функция, которая просто возвращает текущий "тип страницы" вместо использования is_page(), is_preview(), is_single(), is_archive() и т.д.?

Например: я могу найти текущий "тип записи" (post type), но не могу найти соответствующий ему "тип страницы".

0
Все ответы на вопрос 4
2
16

Вам понадобится своя вспомогательная функция, которая будет возвращать нужные данные. Она может выглядеть примерно так:

function wpse8170_loop() {
    global $wp_query;
    $loop = 'notfound';

    if ( $wp_query->is_page ) {
        $loop = is_front_page() ? 'front' : 'page';
    } elseif ( $wp_query->is_home ) {
        $loop = 'home';
    } elseif ( $wp_query->is_single ) {
        $loop = ( $wp_query->is_attachment ) ? 'attachment' : 'single';
    } elseif ( $wp_query->is_category ) {
        $loop = 'category';
    } elseif ( $wp_query->is_tag ) {
        $loop = 'tag';
    } elseif ( $wp_query->is_tax ) {
        $loop = 'tax';
    } elseif ( $wp_query->is_archive ) {
        if ( $wp_query->is_day ) {
            $loop = 'day';
        } elseif ( $wp_query->is_month ) {
            $loop = 'month';
        } elseif ( $wp_query->is_year ) {
            $loop = 'year';
        } elseif ( $wp_query->is_author ) {
            $loop = 'author';
        } else {
            $loop = 'archive';
        }
    } elseif ( $wp_query->is_search ) {
        $loop = 'search';
    } elseif ( $wp_query->is_404 ) {
        $loop = 'notfound';
    }

    return $loop;
}
31 янв. 2013 г. 10:33:06
Комментарии

Да, я надеялся, что в WordPress есть встроенная функция для этого. К сожалению, нет! Спасибо за функцию!

EddyR EddyR
31 янв. 2013 г. 12:04:10

Как-то уже 2022 год, а в WordPress до сих пор нет нативной функции для этого. Отличный ответ.

Artem Artem
12 мар. 2022 г. 17:26:47
2
<?php
var_dump(get_query_var('post_type'));

но даже в этом случае страница может быть одиночной записью (single), архивом или чем-то еще...

Что вы пытаетесь достичь? Возможно, в этом случае будет понятнее, что вам нужно.

Обновление. взгляните на пример функции из темы, которую можно использовать для решения этой задачи. Функция называется twentyeleven_body_classes из темы Twentyeleven. Она возвращает классы, которые могут быть использованы для фильтра body_classes

function twentyeleven_body_classes( $classes ) {

    if ( function_exists( 'is_multi_author' ) && ! is_multi_author() )
        $classes[] = 'single-author';

    if ( is_singular() && ! is_home() && ! is_page_template( 'showcase.php' ) && ! is_page_template( 'sidebar-page.php' ) )
        $classes[] = 'singular';

    return $classes;
}

ничто не мешает вам добавить дополнительные классы. Например is_archive() или что-то еще... В этом случае вы получите типы страниц, которые вам нужны.

31 янв. 2013 г. 08:05:45
Комментарии

Я хочу узнать, является ли страница одиночной записью, архивом, вложением и т.д. Меня не интересует тип записи.

EddyR EddyR
31 янв. 2013 г. 08:10:11

В качестве примера возьмем одну из функций body_classes. Одна из них приведена в обновленном коде.

Oleg Butuzov Oleg Butuzov
31 янв. 2013 г. 08:19:43
0

Если вы поместите этот шаблонный тег внутри тега Body <?php body_class(); ?>, он выведет его в ваш код, например: <body <?php body_class(); ?>>. Это позволит вам увидеть шаблоны, используемые для данной страницы.

Альтернативно, вы можете вывести путь к вызываемому шаблону страницы (например, page.php или single-posttype.php) с помощью этого кода: <?php echo get_page_template() ?>

31 янв. 2013 г. 09:43:51
0

Я немного опоздал, но лучшее и компактное решение с использованием array_filter будет:

function getPage( $arrayIn ) {
    $prefix = 'is_';

    $array = array_filter( array_filter( (array) $arrayIn, function ( $key ) use ( $prefix ) {
        return ( strpos( $key, $prefix ) === 0 );
    }, ARRAY_FILTER_USE_KEY ) );

    unset( $array['is_singular'] );

    return preg_replace( '/^' . preg_quote( $prefix, '/' ) . '/', '', key( $array ) );
}
27 сент. 2017 г. 17:14:51