获取循环外的页面 ID

我想在开始 WordPress 循环之前获得页面 ID

$page = get_query_var('page_id');

显然,它没有返回任何东西。

我只是想检查一个网页的 ID,并添加一个类到 <body>标记的基础上。

109559 次浏览

可以在循环外使用 is_page($page_id)进行检查。

If you're using pretty permalinks, get_query_var('page_id') won't work.

相反,获取查询的对象 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:

global $post;
echo $post->ID;

这个函数从页面当前文件中获取 id。

get_the_ID();

这是正确的密码。

echo $post->ID;

如果你在任何方式搜索这个主题,因为帖子页面(索引页面的选择时,使用静态首页) ,那么正确的答案是这样的:

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 的一些代码)

If you are out of the Loop of WordPress you can not use any of the method of wordpress so you must use pure 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....
}

好好享受吧!

您还可以创建一个通用函数来获取帖子的 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();

使用以下两行代码获取当前页面或帖子 ID

global $post;
echo $post->ID;

如果你在一个页面上,这个不起作用:

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

它可能不会捕获每一个可能的永久链接(特别是因为我正在剥离查询字符串) ,但是您可以修改它以适应您的用例。

我用下面的方法做到了,它对我非常有效。

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

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

要在模板中的任何地方使用,例如 footer.php:

echo $GLOBALS['pageid];