WordPress在循环外获取页面ID


Answers:


157

如果您使用漂亮的永久链接,get_query_var('page_id')将无法使用。

而是从global$wp_query获取查询的对象ID :

// 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。我认为问题在于我在自定义查询后调用它。我想要实际的页面ID。
维克多

奇怪,get_queried_object();对我没用,但是$wp_query->get_queried_object();对我get_queried_object();有用。
SeanJA 2014年

可能是您的可变范围-您是否$wp_query使用自定义查询覆盖了?
TheDeadMedic 2014年

9

您还可以创建一个泛型函数来获取帖子的ID,无论帖子是在循环的外部还是在循环内部(处理两种情况):

<?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-这是不正确的。该代码在page.php的开头起作用
iWizard 2013年


1

如果您在页面上,但无法使用:

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

您可以尝试使用PHP手动构建永久链接,以便查找帖子ID:

// 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

此功能从当前页面获取ID。

get_the_ID();

4
嗯...仅当您处于循环状态时,此方法才有效:返回当前帖子的数字ID。该标签必须在The Loop中。
drzaus

@drzaus实际上,这确实在循环之外起作用。
hitautodestruct 2015年

1
@hitautodestruct在技术上正确地说它可以在循环外运行时,但这不是可靠的用法-这是根据个人经验以及查看源代码得出的。底层方法get_post恰好使用$GLOBALS['post'],它可能在某个时候被填充,但是除非/直到您进入循环,否则无法保证。
drzaus



0

我已经按照以下方式完成了它,并且对我来说效果很好。

首先在header.php中声明一个全局变量,在更改之前为该帖子或页面分配ID,因为LOOP为它分配了最后显示的条目的ID:

$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 2014年

1
您编写了50行代码来获取中已经存在的变量$post->ID。即使您不在循环中,也可以使用许多许多Wordpress函数。并不是循环中必须使用的少数几个。
JakeParis 2014年

好吧,如果您删除注释的代码,我写了20行。这些行节省了我学习wordpress的过程的一天。您写了3行,但是在循环之外时不对OP问题分配任何解决方案。
edcv 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.