Wordpress Получить идентификатор страницы за пределами цикла

66

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

$page = get_query_var('page_id');

По-видимому, он ничего не возвращает.

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

Теги:

10 ответов

138
Лучший ответ

Если вы используете довольно постоянные ссылки, 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();
  • 0
    Идеально подходит для красивых постоянных ссылок. Я использовал глобальный $ post; echo $ post-> ID; Но не сработало. Спасибо!
  • 6
    get_queried_object_id(); верните 0 для меня. Я думаю, что проблема в том, что я звоню после специального запроса. Я хочу де фактический идентификатор страницы.
Показать ещё 2 комментария
7

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

<?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();
  • 0
    это на самом деле работает? это либо бесконечно рекурсивная функция, либо она сломается, потому что get_the_ID - это уже объявленная функция. я думаю, что вы хотели изменить имя функции, или это было частью класса?
  • 0
    @drzaus спасибо за указание на это. Я починил это.
5

Используйте эту глобальную $post вместо:

global $post;
echo $post->ID;
  • 0
    Это будет работать только после цикла, а не до, так как $post инициализируется при запуске цикла.
  • 6
    @ ChristianDavén - это неправда. Этот код работает в начале page.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 "Posts Pages" title - некоторый код из tammyhart)

0

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

$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

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

global $post;
echo $post->ID;
0

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

get_the_ID();
  • 4
    хм ... это работает, только если вы находитесь в цикле : возвращает числовой идентификатор текущего сообщения. Этот тег должен быть внутри Цикла.
  • 0
    @drzaus На самом деле это работает вне цикла ... Проверьте это.
Показать ещё 3 комментария
0

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

  • 0
    Я не хочу проверять страницу, я хочу получить идентификатор текущей страницы.
  • 0
    @atif Вы уверены, что ID страницы действительно передается? Вы случайно не на первой полосе?
Показать ещё 1 комментарий
-3

Если вы не используете Loop 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....
}

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

  • 2
    Очень неправильно во всех отношениях.
  • 0
    Может быть .. Не могли бы вы дать более подробную информацию об этом и показать мне свое решение?
Показать ещё 2 комментария
-4

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

echo $post->ID;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню