WordPress Отримати ідентифікатор сторінки за межами циклу


75

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

$page = get_query_var('page_id');

Мабуть, це нічого не повертає.

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


Відповіді:


157

Якщо ви використовуєте досить постійні посилання, 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();

Ідеально підходить для гарних постійних посилань. Я використовував глобальний $ post; echo $ post-> ID; Але це не спрацювало. Дякую!
Sumith Harshan

7
get_queried_object_id();поверніть 0 для мене. Я думаю, що проблема в тому, що я дзвоню йому після спеціального запиту. Я хочу отримати фактичний ідентифікатор сторінки.
Віктор

Дивно, get_queried_object();але у мене не вийшло, але $wp_query->get_queried_object();працює ... Я подивився на get_queried_object();і це те саме, що зробити останнє.
SeanJA

Це може бути сфера вашої змінної - ви перевизначили $wp_queryспеціальний запит?
TheDeadMedic

9

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

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

7

Натомість використовуйте цей глобальний $ post:

global $post;
echo $post->ID;

Це буде працювати лише після циклу, а не раніше, оскільки $postініціалізується при запуску "циклу".
Крістіан Давен,

6
@ ChristianDavén - це неправда. Цей код працює на початку сторінки
.php

4

Якщо ви яким-небудь способом шукали цю тему через сторінку публікації (альтернативна сторінка індексу при використанні статичної першої сторінки), то правильна відповідь така:

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

(взято з Forrst | Echo WordPress "Сторінка публікацій" - Деякий код від tammyhart )


1

Якщо ви знаходитесь на сторінці, але це не працює:

$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);

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


0

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


Я не хочу перевіряти сторінку, я хочу отримати ідентифікатор поточної сторінки.
Atif Mohammed Ameenuddin

@atif ти впевнений, що насправді передається ідентифікатор сторінки? Ви випадково не знаходитесь на першій сторінці?
Пекка,

0

Ця функція отримує ідентифікатор з поточної сторінки.

get_the_ID();

4
гм ... це працює, лише якщо ви в циклі : Повертає числовий ідентифікатор поточного повідомлення. Цей тег повинен бути в межах циклу.
drzaus 01.03.13

@drzaus Насправді це працює за межами циклу ... Перевірте це.
hitautodestruct

1
@hitautodestruct, хоча ви технічно правильні, що він може працювати за межами циклу, це не надійне використання - це як з особистого досвіду, так і з погляду на вихідний код. Випадково використовується основний метод get_post$GLOBALS['post'] , який міг бути заповнений у певний момент, але немає ніякої гарантії, поки / поки ви не в циклі.
drzaus


0

Використовуйте два рядки коду, щоб отримати ідентифікатор поточної сторінки чи публікації

global $post;
echo $post->ID;

0

Я зробив це наступним чином, і це прекрасно для мене спрацювало.

Спочатку оголошено глобальну змінну в header.php, призначаючи ідентифікатор допису або сторінки до її зміни, оскільки LOOP присвоює їй ідентифікатор останнього показаного запису:

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

І використовувати в будь-якому місці шаблону, наприклад у footer.php:

echo $GLOBALS['pageid];



-3

Якщо ви вийшли з циклу 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....
}

Насолоджуйтесь!


Можливо .. Не могли б ви дати більше подробиць про це та показати мені своє рішення?
edcv

1
ви написали 50 рядків коду, щоб отримати змінну, яка вже існує в $post->ID. Навіть якщо ви не в курсі, ви можете використовувати багато-багато функцій Wordpress. Тільки не небагато, які потрібно використовувати в циклі.
JakeParis

Ну, якщо ви видалите коментований код, я написав 20 рядків. Ці рядки врятували мені день у процесі вивчення WordPress. Ви написали 3 рядки, але ви не використовуєте жодного рішення для запитання, коли ви знаходитесь поза циклом.
edcv
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.