WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Черная пятница на сайте Template Monster

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()

Является основой для: is_shop()
✈ 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 Заметка про кириллицу и ярлык (слаг)

Если у вас на сайте кириллица не меняется на латиницу - нет плагина Cyr-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_single()
  • Смотрите: is_singular()
  • Global. WP_Query. $wp_query WordPress Query object.

Список изменений

С версии 1.5.0 Введена.

Код is page: wp-includes/query.php WP 5.3

<?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вязанные функции

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

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

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

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

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

    Ответить17.Авг.2012 в 19:04 #
    • Саня

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

      Ответить16.Сен.2012 в 17:09 #
  • Rafael www.travelonlain.ru

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

    1
    Ответить31.Окт.2013 в 10:48 #
  • Миша tyrin4.ru

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

    Ответить17.Дек.2013 в 20:59 #
    • Kama7631

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

      if( is_page(42) ){
      	// код для страницы с ID 42
      }
      1
      Ответить17.Дек.2013 в 21:45 #
      • Салауат smartlp.kz

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

        Ответить08.Апр.2017 в 22:35 #
  • Дмитрий
    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() - работает, а вот для постоянных страниц скрипт не цепляется. Что не так? Спасибо.

    Ответить10.Сен.2014 в 16:05 #
    • Kama7631

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

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

      if ( ! is_front_page() ){}
      Ответить10.Сен.2014 в 18:05 #
      • Дмитрий

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

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

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

        Ответить11.Сен.2014 в 01:09 #
  • 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>

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

    Ответить12.Ноя.2014 в 23:45 #
  • Лариса

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

    Ответить03.Дек.2014 в 13:30 #
    • Kama7631
      $parent_id = 25;
      if( $post->post_parent == $parent_id ){
      	// это дочерняя страница страницы с ID 25
      }
      1
      Ответить03.Дек.2014 в 13:41 #
  • campusboy3430 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' );
    Ответить28.Дек.2015 в 13:04 #
    • campusboy3430 www.youtube.com/c/wpplus

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

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

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

      Ответить28.Дек.2015 в 13:12 #
    • Kama7631

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

      Ответить28.Дек.2015 в 19:53 #
      • campusboy3430 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' );
        Ответить30.Дек.2015 в 00:36 #
  • campusboy3430 www.youtube.com/c/wpplus
    is_page( array(42, 'o-saite', 'О сайте') );

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

    Ответить21.Июн.2016 в 14:48 #
    • Kama7631

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

      1
      Ответить21.Июн.2016 в 22:26 #
      • campusboy3430 www.youtube.com/c/wpplus

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

        Ответить21.Июн.2016 в 22:33 #
  • Спецтехник pogruzovik.ru/rent/location/moscow_regio...

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

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

    Ответить29.Ноя.2017 в 18:37 #
    • Sergey

      Можно вот так просто

      function is_subpage() {
      	global $post;
      	return (bool) $post->post_parent;
      }
      Ответить18.Сен.2018 в 00:55 #
  • Алексей avtobsk.ru

    Здравствуйте, а как сделать по данной аналогии ссылку "Назад", что бы определялось, есть ли у страницы(или записи) родитель, и формировалась ссылка на родитель. Если нет родителя, то ссылка вела бы на главную. Что то по аналогии хлебных крошек для всех типов записей в вордпресс. Внешний вид везде один - ссылка "Назад"?

    Ответить19.Ноя.2018 в 14:42 #
Здравствуйте, !     Войти . Зарегистрироваться