WordPress как на ладони
wordpress jino

is_page() WP 1.5

Проверяет отображается ли страница "постоянной страницы". Можно указать ID, ярлык или заголовок страницы для проверки. Условный тег.

Смотрите также похожие функции:

Вернет true при передаче пустых значений

Будьте внимательны, потому что следующие вызовы этой функции вернут true:

is_page( '' )
is_page( 0 )
is_page( '0' )
is_page( null )
is_page( false )
is_page( array() )

Нельзя использовать внутри Цикла WordPress

Из-за того что в при работе цикла переписываются некоторые глобальные переменные, is_page() не получится использовать внутри цикла. Впрочем, в этом нет необходимости. Чтобы использовать этот Тег шаблона после цикла, произвольный цикл (запрос на получение записей) надо сбросить функцией: wp_reset_query()

✈ 1 раз = 0.000012с = очень быстро | 50000 раз = 0.02с = скорость света PHP 7.0.8, WP 4.6.1

Хуков нет.

Возвращает

true/false. true, если отображается тип страницы: постоянной страницы и false, если отображается любой другой тип страницы.

Использование

if( is_page( $page ) ){
	 //код
}
$page(строка/число/объект)

ID, ярлык, заголовок страницы, которую нужно проверить. Можно указать массив из любых этих значений, чтобы выставить на проверку несколько разных страниц.

По умолчанию: нет

Примеры

#1 Функция в действии

Различные примеры использования - случаи когда функция возвращает true (срабатывает):

is_page();
// Когда отображается любая постоянная страница.

is_page(42);
// когда отображается страница с ID 42.

is_page('О сайте');
// Когда отображается страница с заголовком "О сайте".

is_page('o-saite');
// Когда отображается страница со слагом "o-saite".

is_page( array(42, 'o-saite', 'О сайте') );
// Параметры можно комбинировать. Добавлено в версии 2.5.

is_page( array('sample-page', 'contacts', 23, 34) );
// Можно проверять несколько страниц одновременно. Все указанные страницы разные...

#2 Заметка про кириллицу и ярлык (слаг)

Если у вас на сайте кириллица не меняется на латиницу - нет плагина Сry to Lat или ему подобного, то при создании записи её ярлык изменяется и кириллица превращается в спец символы (контакты - %d0%ba%d0%be%d0%bd%d1%82%d0%b0%d0%ba%d1%82%d1%8b), поэтому при проверке нужно это учитывать. Т.е. если проверяется не заголовок, а ярлык (post_name), то делайте так:

is_page('о-сайте'); // неправильно

is_page( sanitize_title('о-сайте') ); // правильно

#3 Проверка находимся ли мы на дочерней странице у постоянной страницы

В WordPress нет функции is_subpage(). Но такую проверку можно сделать таким кодом:

Пример 1

global $post;     // Если за пределами цикла

if ( is_page() && $post->post_parent ) {
	// Это дочерняя страница

} else {
	// Это не дочерняя страница
}

Пример 2

Можно создать свою функцию is_subpage(). Добавьте такой код в файл темы functions.php. Она работает как же как первый пример: проверят является ли текущая страница дочерней, т.е. страница ли это вообще и есть ли у нее родительская страница.

Такую функцию полезно создавать, когда на сайте предполагается делать проверки как в примере 1 много раз.

/*
 * Проверят является ли текущая постоянная страница дочерней страницей
 * Возвращает true или false
 */
function is_subpage() {
	global $post;

	if ( is_page() && $post->post_parent ) {
		return $post->post_parent;
	} 
	return false;
}

Пример 3

Чтобы определить страницу "О сайте" или её дочернюю страницу, используйте этот пример. Этот пример может пригодится, когда нужно указать переменную для всей ветки страниц. Здесь мы укажем картинку для ветки:

if ( is_page( 'about' ) || '2' == $post->post_parent ) {    
	// Это страница "О сайте" или её дочерняя страница
	$bannerimg = 'about.jpg';

}
elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) {    
	$bannerimg = 'teaching.jpg';

}
elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) { 
	$bannerimg = 'admissions.jpg';

}
else { 
	$bannerimg = 'home.jpg'; // если мы на неопределенной странице, выведем картинку по умолчанию
}

Пример 4

Создадим функцию, которая проверит все уровни вложенности, всю ветку подстраниц и если мы на одной из страниц ветки, то функция вернет true, в противном случае false. Т.е. предположим у нас есть страница "О нас" у нее есть дочерняя страница "Наши услуги", а у этой страницы есть еще дочерние страницы "Покраска" и "Отделка". В эту функцию передадим ID страницы "О нас" и она будет возвращать true если мы находимся на любой из указанных страниц:

/*
 * Проверка дочерних страниц по всем уровням вложенности
 * $pid = ID страницы все уровни дочерних страниц которой нужно проверить
 */
function is_tree( $pid ){
	global $post;

	// если мы уже на указанной странице выходим
	if ( is_page( $pid ) )
		return true;

	$anc = get_post_ancestors( $post->ID );
	foreach ( $anc as $ancestor ) {
		if( is_page() && $ancestor == $pid ) {
			return true;
		}
	}

	return false;
}

#4 Проверка разделения страницы

В записях можно использовать шоткод <!--nextpage-->. Такой код будет делить текст записи на несколько страниц. Это полезно, когда вам нужно вывести метаданные только на первой странице, разделенной на несколько страниц записи.

Пример 1

$paged = $wp_query->get( 'paged' );

if ( ! $paged || $paged < 2 ){
	// Пост не разделен на страницы или это не первая страница.
}
else {
	// Это 2,3,4 ... страница разделенного поста.
}

Пример 2

$paged = get_query_var( 'paged' ) ? get_query_var( 'paged' ) : false;
if ( $paged === false ){
	// Пост не разделен на страницы или это не первая страница.
}
else {
	// Это 2,3,4 ... страница разделенного поста.

}

Пример 3

if ( 0 === get_query_var( 'page' ) ) {
	// Пост не разделен на страницы или это не первая страница.
}
else {
	// Это 2,3,4 ... страница разделенного поста.
}

Код is_page: wp-includes/query.php VER 4.9.8

<?php
function is_page( $page = '' ) {
	global $wp_query;

	if ( ! isset( $wp_query ) ) {
		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.' ), '3.1.0' );
		return false;
	}

	return $wp_query->is_page( $page );
}

Cвязанные функции

Из метки: Условные теги (типов страниц и запросов )

Еще из метки: Условные теги (все)

Еще из раздела: Запросы

22 коммента
Вопросы 2 Все
  • Андрей

    А можно через запятую указать id нужных постов, которые нуждаются в проверке? или для этого другая функция?

    Ответить5.10 лет назад #
    • Саня

      Да можно через запятую указать, только все это нужно в массив загнать сначала
      Вот так
      if( is_page( array(344, 352, 366, 370, 368, 372, 347, 376, 378) ) ){}

      Ответить5.9 лет назад #
  • Rafael cайт: www.travelonlain.ru

    А можно ли применить такое условие, все дочерние страницы, у которых родитель id=100

    1
    Ответить4.7 года назад #
  • Миша cайт: tyrin4.ru

    А можно ли сделать условие, чтобы текст или ссылка выводилась на определённой странице?

    Ответить4.6 года назад #
    • Kama6714

      А чем варианты из примера не подходят?

      if( is_page(42) ){
      	// код для страницы с ID 42
      }
      1
      Ответить4.6 года назад #
      • Салауат cайт: smartlp.kz

        Спасибо. Разобрался уже )) Я указывал не тот айди. Айди страницы оказывается там где ссылка на браузере, а именно цифра ))

        Ответить1.3 год назад #
  • Дмитрий
    function source() { 
    	if ( !is_front_page() || is_page('')) {
    	wp_enqueue_script( 'source', get_bloginfo( 'template_directory' ).'/js/source.js', array(), '1.0', true );
    	}
    }   
    add_action('wp_enqueue_scripts', 'source');

    не работает. Точнее та часть функции, где идет проверка !is_front_page() - работает, а вот для постоянных страниц скрипт не цепляется. Что не так? Спасибо.

    Ответить3.9 года назад #
    • Kama6714

      Какое условие вам нужно выполнить? Странно, что для страниц не цепляется - должно!

      Условие странное у вас !is_front_page() уже включает все is_page() не понятно что вам нужно. Может просто так сделать:

      if ( ! is_front_page() ){}
      Ответить3.9 года назад #
      • Дмитрий

        так вот в том то и дело, что судя по результату не включает. условие в первоначальном виде было такое: что если это не is_front_page(), то подключать скрипт (как Вы в коменте предложили). и это условие работает при переходи на странице постов. но когда происходит переход на "постоянной страницы" - условие (вида:

        if ( !is_front_page() || is_page(''))

        ) не работает (скрипт не подключается).но не работает он, только для "постоянной страницы" ), а, в тот же момент, для страниц постов оно работает (срипт подключаетсь). Как бы пополам pardon

        Ответить3.9 года назад #
  • Sarbai

    Ребятки помогите! Столкнулся с такого рода бедой.... Мне нужно чтоб на главной не показывало основной блок контента. имею вот такой код....

    <section id="content">
      <div class="grid-block">
    						<?php if ($this['modules']->count('breadcrumbs')) : ?>
    						<section id="breadcrumbs"><?php echo $this['modules']->render('breadcrumbs'); ?></section>
    						<?php endif; ?>
    
    						<?php echo $this['template']->render('content'); ?>
    
    					</div></section>

    если я его закаменчиваю блок пропадае но на всем зайте а мне это не нада ибо другие странички где есть нужная инфа пропадают тоже. Подскажите как мне поставить условия или что дописать чтоб на главной этот блок скрывался. Я просто в РНР вообще практически ноль подскажите куда копать?

    Ответить3.7 года назад #
  • Лариса

    Подскажите, а как сделать условие вывода на всех дочерних страницах указанной, причем на родительской выводиться не должно?

    Ответить3.6 года назад #
    • Kama6714
      $parent_id = 25;
      if( $post->post_parent == $parent_id ){
      	// это дочерняя страница страницы с ID 25
      }
      1
      Ответить3.6 года назад #
  • campusboy2947 cайт: www.youtube.com/c/wpplus

    Столкнулся с проблемой. Решил отменять вывод различного рода скриптов/стилей на страницах, где они не используются. Чтобы не писать постоянно wp_deregister_style и wp_deregister_script подумал отключать сразу блоки, к примеру:

    remove_action ( 'wp_enqueue_scripts', 'ratings_scripts' );

    Разом отменяю вывод css и js от плагина WP-PostRatings. Окей, подумал я, отключу и кучу хлама от плагина Contact Form 7, но с условием, что на некоторых страницах они всё-таки должны загрузиться. Пишу:

    if ( is_page(10) ) remove_action ('wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts');

    Не работает! Ну, думаю, может is_page не определена ещё. Пишу по-другому:

    if ( $wp_query->is_page ) remove_action ('wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts');

    И снова не работает. В чем может быть проблема? Если условия не ставить, то всё срабатывает - ничего не выводится. Подскажите, пожалуйста, решение проблемы. Тут явно что-то с приоритетами, но у CF7 нет там приоритета чтобы 1 к 1 сделать, вот его код:

    add_action( 'wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts' );
    Ответить2.5 года назад #
    • campusboy2947 cайт: www.youtube.com/c/wpplus

      Ну и ещё, если написать вот так:

      if ( true ) remove_action ('wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts');

      То отмена происходит.

      Ответить2.5 года назад #
    • Kama6714

      Очевидно что is_page(10) не срабатывает, скорее всего проверка происходит когда еще $wp_query не определена. Нужно позже события wp или на нем...

      Ответить2.5 года назад #
      • campusboy2947 cайт: www.youtube.com/c/wpplus

        Не получилось, и так и сяк делал - не вышло. Пришлось сделать дедовским методом:

        function disable_hlam() {
         remove_action( 'wp_head', 'rest_output_link_wp_head', 10, 0 );
         remove_action ( 'wp_enqueue_scripts', 'ratings_scripts' );
         if ( $_SERVER["REQUEST_URI"] == '/kontakty' or $_SERVER["REQUEST_URI"] == '/' ) {}
         else {
          remove_action ('wp_enqueue_scripts', 'wpcf7_do_enqueue_scripts');
          wp_deregister_script( 'jquery' );
         }
        }
        add_action( 'wp', 'disable_hlam' );
        Ответить2.5 года назад #
  • campusboy2947 cайт: www.youtube.com/c/wpplus
    is_page( array(42, 'o-saite', 'О сайте') );

    А поиск идёт как AND или OR? К примеру была страница со слугом 'o-saite' и id = 42, а потом я слуг поменял на "about" - сработает ли?

    Ответить2 года назад #
    • Kama6714

      OR. Если ты сразу все виды для одной страницы указываешь, то сработает...

      1
      Ответить2 года назад #
      • campusboy2947 cайт: www.youtube.com/c/wpplus

        Спасибо за ответ! Довольно важный момент, снимает часть "ответственности" при проектировании.

        Ответить2 года назад #
  • @ Елена

    а можно задать, только для дочерних страниц, следующая/предыдущая, чтобы не ссылки были только "внутри" дочерних страниц, определенной страницы? отдельный шаблон не выход, так как следующая ведет на след страницу, а не пропадает или на первую дочернюю

    3
  • Спецтехник cайт: pogruzovik.ru/rent/location/moscow_regio...

    Здравствуйте!
    Как вывести баннер на странице поисковых результатов? Это не таксономия, не страница и не запись. Вот пример такой страницы http://pogruzovik.ru/rent-cat_kompaktnaya-tehnika&location_moscow_region/

    Наверное нужно сделать проверку на url? Можете показать как это сделать?

Здравствуйте, !     Войти . Зарегистрироваться