我正在尝试获取一个页面的ID(在循环之外),该页面的内容中有另一个CPT的循环,使用一个短代码。
如果我做了print_r
属于get_queried_object()
, 如果我echo
$post->ID
我获取二次循环中最后一项的ID
如果我echo
get_queried_object_id()
, 我明白了0
总是
下面是我当前使用的代码
function get_meta_values() {
global $post;
$queried_object = get_queried_object();
echo \'<pre>\';
print_r( $queried_object ); //Returns args used to register the CPT
echo \'<br> $queried_object->ID: \' . $queried_object->ID; //Returns Nothing
echo \'<br>get_queried_object_id(): \'. get_queried_object_id(); // Returns 0 all the time
echo.\'<br>PageID: \' . $post->ID; // Returns the ID of last item in the secondary loop
echo \'</pre>\';
}
add_action( \'wp_footer\', \'get_meta_values\' );
我的目标是获取页面的ID(其中短代码是)以检索一些自定义字段值。
EDIT: 我使用的是WooCommerce,但输出产品的快捷码是custom。我知道我可以通过其他方式绕过这个问题,但我只是好奇为什么这不起作用。
SO网友:iantsch
正如其他人已经发现的那样:如果您有带有自定义查询的第三方插件,那么您将度过糟糕的一天!
一种解决方案可能是缓存结果。
Template (例如:page.php)
while (have_posts()): the_post();
global $my_cached_data;
$post_id = get_the_ID();
/*
* If you have single meta keys, this array_map function
* makes them easy to access; otherwise just use:
*
* $my_cached_data[$post_id] = get_post_meta( $post_id)
*/
$my_cached_data[$post_id] = array_map(
function( $a )
{
return $a[0];
},
get_post_meta( $post_id)
);
endwhile;
footer.php
global $my_cached_data;
echo "<pre>".print_r($my_cached_data, true)."</pre>";
Possible Result (页面ID 2和15具有相同的post元数据)
array(2) {
[2]=>
array(2) {
["meta_key"]=>
string(10) "meta_value"
["another_key"]=>
string(10) "meta_value"
}
[15]=>
array(2) {
["meta_key"]=>
string(10) "meta_value"
["another_key"]=>
string(10) "meta_value"
}
}