全局变量$POST返回错误的对象

时间:2017-11-29 作者:dǝɥɔS ʇoıןןƎ

在我的header.php 文件,我一直在尝试检索当前页面的slug,以检查它的WooCommerce产品存档/商店页面。我跟着this 类似问题的答案,没有用;返回的不是当前页面的slug,而是第一个出售的项目slug。我的问题如下:

为什么$post->post_name 回来test-product-magazine, 而不是正确的,shop?

<code>test-product-magazine</code>, instead of the correct, <code>shop</code>

<?php 
    global $post;
    echo "post_name: " . $post->post_name;
?>

1 个回复
最合适的回答,由SO网友:Jacob Peattie 整理而成

为什么是test-product-magazine, 而不是正确的,shop?

全球$post 对象不是确定归档页的可靠方法,因为对象通常是循环外主查询的第一个帖子。由于主要查询的是存档中的帖子,而不是存档本身(通常甚至不是页面),因此$post 对象将不表示可能用于存档的任何页面。

这是因为商店页面和博客页面实际上没有显示出来。因此,他们不需要为模板标记设置全局post对象。使用的页面位(如标题)不会从全局post对象中提取the_title(), 它们直接由数据库中页面的ID提取。查看以下行woocommerce_page_title() WooCommerce是如何做到这一点的:

$shop_page_id = wc_get_page_id( \'shop\' );
$page_title   = get_the_title( $shop_page_id );
对于帖子页面,WordPress从不使用全局$post 对象,它只检查查询的页面名称是否是数据库中设置的posts页面,并相应地修改查询:

if  ( \'page\' == get_option(\'show_on_front\') && isset($this->queried_object_id) && $this->queried_object_id == get_option(\'page_for_posts\') ) {
    $this->is_page = false;
    $this->is_home = true;
    $this->is_posts_page = true;
}
因此,获取Shop页面和Posts页面的正确方法是使用适当的条件函数,然后检查数据库中的相关ID,并使用该ID检索所需的任何信息。对于商店页面,这将是:

if  ( is_shop() ) {
    $shop_page_id = wc_get_page_id( \'shop\' );
    $shop_page_object = get_post( $shop_page_id );

    // echo $shop_page_object->post_name;
}
对于帖子页面,应该是:

if  ( is_home() && ! is_front_page() ) {
    $posts_page_id = get_option( \'page_for_posts\' );
    $posts_page_object = get_post( $posts_page_id );

    // echo $posts_page_object->post_name;
}
如何为WooCommerce产品存档/商店页面创建自定义页面模板?

这是离题的(第一个问题可能也是,但我认为它与帖子页面的相关性也证明了答案的合理性),但如果你看看WooCommerce Documentation on the issue:

WooCommerce模板文件包含markuptemplate structure 对于frontend and HTML emails 您的店铺。

。。。

模板文件可以在/woocommerce/templates/ 目录:

。。。

您可以在中编辑这些文件upgrade-safe way 使用overrides. 将其复制到名为/woocommerce 保持相同的文件结构,但删除/templates/ 子目录。

您询问的相关文件是woocommerce/templates/archive-product.php. 但请注意,这也用于类别/标签/等归档。如果您希望店铺页面(仅店铺页面)不同,则需要检查is_shop() 并相应地输出不同的标记。

结束