WordPress Получить идентификатор страницы вне цикла

Я хочу получить идентификатор страницы перед запуском цикла в WordPress. я использую

$page = get_query_var('page_id');

Судя по всему, он ничего не возвращает.

Я просто хочу проверить страницу на ее идентификатор и добавить класс в тег <body> на его основе.


person Atif    schedule 27.06.2010    source источник
comment
stackoverflow.com/questions/22351038/   -  person    schedule 17.12.2016


Ответы (11)


Если вы используете красивые постоянные ссылки, get_query_var('page_id') не сработает.

Вместо этого получите идентификатор запрошенного объекта из глобального $wp_query:

// Since 3.1 - recommended!
$page_object = get_queried_object();
$page_id     = get_queried_object_id();


// "Dirty" pre 3.1
global $wp_query;

$page_object = $wp_query->get_queried_object();
$page_id     = $wp_query->get_queried_object_id();
person TheDeadMedic    schedule 27.06.2010
comment
Идеально подходит для красивых постоянных ссылок. Я использовал глобальный $post; эхо $post-›ID; Но не сработало это. Спасибо! - person Sumith Harshan; 28.09.2013
comment
get_queried_object_id(); вернуть 0 для меня. Я думаю, что проблема в том, что я вызываю его после пользовательского запроса. Мне нужен фактический идентификатор страницы. - person Victor; 23.05.2014
comment
Странно, get_queried_object(); у меня не сработало, а $wp_query->get_queried_object(); работает... Я посмотрел на get_queried_object(); и это то же самое, что и последнее. - person SeanJA; 24.09.2014
comment
Может быть, ваша переменная область - вы переопределили $wp_query с помощью специального запроса? - person TheDeadMedic; 25.09.2014
comment
Обратите внимание, что get_queried_object_id() возвращает идентификатор категории, если он находится на странице категории, поскольку идентификатор страницы отсутствует. - person Scott; 24.02.2021

Вы также можете создать общую функцию для получения идентификатора сообщения вне или внутри цикла (обрабатывает оба случая):

<?php

/**
 * @uses WP_Query
 * @uses get_queried_object()
 * @see get_the_ID()
 * @return int
 */
function get_the_post_id() {
  if (in_the_loop()) {
       $post_id = get_the_ID();
  } else {
       global $wp_query;
       $post_id = $wp_query->get_queried_object_id();
         }
  return $post_id;
} ?>

И просто сделайте:

$page_id = get_the_post_id();
person Nadeem Khan    schedule 07.09.2014

Вместо этого используйте этот глобальный $post:

global $post;
echo $post->ID;
person ryscript    schedule 08.12.2011
comment
Это будет работать только после цикла, а не до него, так как $post инициализируется при запуске цикла. - person Christian Davén; 28.05.2013
comment
@ChristianDavén - это неправда. Этот код работает в начале page.php - person iWizard; 14.06.2013

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

if (get_option('show_on_front') == 'page') {
    $page_id = get_option('page_for_posts');
    echo get_the_title($page_id);
}

(взято из Forrst | Echo WordPress Posts Page title — Код от tammyhart)

person banesto    schedule 11.07.2013

Если вы находитесь на странице, и это не работает:

$page_object = get_queried_object();
$page_id     = get_queried_object_id();

вы можете попытаться создать постоянную ссылку вручную с помощью PHP, чтобы вы могли искать идентификатор сообщения:

// get or make permalink
$url = !empty(get_the_permalink()) ? get_the_permalink() : (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$permalink = strtok($url, '?');

// get post_id using url/permalink
$post_id = url_to_postid($url);

// want the post or postmeta? use get_post() or get_post_meta()
$post = get_post($post_id);
$postmeta = get_post_meta($post_id);

Он может не перехватывать все возможные постоянные ссылки (особенно с учетом того, что я удаляю строку запроса), но вы можете изменить ее в соответствии со своим вариантом использования.

person JBB    schedule 04.10.2017

Вы можете использовать is_page($page_id) вне цикла для проверки.

person nikc.org    schedule 27.06.2010
comment
Я не хочу проверять страницу, я хочу получить идентификатор текущей страницы. - person Atif; 27.06.2010
comment
@atif вы уверены, что идентификатор страницы действительно передается? Ты случайно не на первой полосе? - person Pekka; 27.06.2010

Эта функция получает идентификатор текущей страницы.

get_the_ID();
person jruzafa    schedule 14.03.2012
comment
гм... это работает, только если вы в цикле: Возвращает числовой идентификатор текущего поста. Этот тег должен находиться внутри цикла. - person drzaus; 02.03.2013
comment
@drzaus На самом деле это работает вне цикла ... Проверьте это. - person hitautodestruct; 19.04.2015
comment
@hitautodestruct, хотя технически вы правы в том, что он может работать вне цикла, это ненадежное использование - это также из личного опыта, а также из исходного кода. Базовый метод get_post использует $GLOBALS['post'], который мог быть заполнен в какой-то момент, но нет никакой гарантии, если/пока вы не в курсе. - person drzaus; 20.04.2015
comment

Используйте две строки кода ниже, чтобы получить текущую страницу или идентификатор сообщения.

global $post;
echo $post->ID;
person Braj Kishor Sah    schedule 03.07.2017

Я сделал это следующим образом, и он отлично сработал для меня.

Сначала объявили глобальную переменную в header.php, назначив идентификатор записи или страницы перед ее изменением, поскольку ЦИКЛ присваивает ей идентификатор последней показанной записи:

$GLOBALS['pageid] = $wp_query->get_queried_object_id();

И использовать в любом месте шаблона, например в footer.php:

echo $GLOBALS['pageid];

person Edd    schedule 26.02.2018

Это правильный код.

echo $post->ID;
person Banna    schedule 14.06.2013

Если вы вышли из цикла WordPress, вы не можете использовать какой-либо метод WordPress, поэтому вы должны использовать чистый php.

Вы можете использовать этот код. И обязательно поможет :)

$page_id = @$_GET['page_id'];

if (!is_numeric($page_id)) {
    // Then the uri must be in friendly format aka /my_domain/category/onepage/
    // Try this
    //$path = '/www/public_html/index.php/';
    ///$path = '/my_domain/category/onepage/';
    $path = $_SERVER['REQUEST_URI'];
    // Clean the uri
    //$path = str_replace('/', '', $page);
    $path = str_replace('.php', '', $path);
    //$path = str_replace('?s=', '', $path);
    $path = $path ? $path : 'default';

    $path_len = strlen($path);
    $last_char = substr($path, $path_len -1);
    //echo $last_char;
    $has_slash = strpos($last_char, "/");
    //echo $has_slash;
    if ($has_slash === 0) :
        $path = substr($path, 0, $path_len -1);
    elseif ($has_slash === null) :
        $path = substr($path, 0, $path_len);
    endif;
    //echo "path: ".$path; // '/www/public_html/index'
    $page = substr(strrchr($path, "/"), 1);
    echo "page: ".$page; // 'index'
}

$my_page_id = 31;
$my_page = 'mypage';

//echo "page: ".$page;
//echo "page_id ".$page_id;
if($page_id == $my_page_id || $page == $my_page) 
{
    // your stuff....
}

Наслаждаться!

person edcv    schedule 12.02.2014
comment
Может быть .. Не могли бы вы рассказать об этом подробнее и показать мне свое решение? - person edcv; 10.11.2014
comment
вы написали 50 строк кода, чтобы получить переменную, которая уже существует в $post->ID. Даже если вы не в курсе, вы можете использовать множество функций Wordpress. Только не те немногие, которые необходимо использовать в цикле. - person JakeParis; 11.11.2014
comment
Ну, если вы удалите закомментированный код, я написал 20 строк. Эти строки спасли мой день в процессе изучения WordPress. Вы написали 3 строки, но не предлагаете никакого решения вопроса ОП, когда находитесь вне цикла. - person edcv; 14.11.2014