为什么是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模板文件包含markup 和template structure 对于frontend and HTML emails 您的店铺。
。。。
模板文件可以在/woocommerce/templates/
目录:
。。。
您可以在中编辑这些文件upgrade-safe way 使用overrides. 将其复制到名为/woocommerce
保持相同的文件结构,但删除/templates/
子目录。
您询问的相关文件是woocommerce/templates/archive-product.php
. 但请注意,这也用于类别/标签/等归档。如果您希望店铺页面(仅店铺页面)不同,则需要检查is_shop()
并相应地输出不同的标记。