为什么此IS_PAGE条件不起作用?

时间:2018-04-05 作者:omega33

我正在尝试做一些我认为相当简单的事情。但它不起作用,让我弄不明白为什么。如有任何见解,将不胜感激。

我有个习惯/woocommerce/archive-product.php 主题中的页面。它工作正常,在调用WC产品页面的任何地方都可以显示。

我正在尝试向其添加一个Worpdress条件。具体如下:

  if ( is_page( \'Bangles\',\'bangles\' ) ) {

CODE TO RUN

} else {

OTHER CODE TO RUN

}
然而,它从未被证明是真实的。

我希望返回的页面url为site.org/product-categories/bangles. 在这种情况下,“手镯”是产品类别。这也是页面的标题。

我想Bangles (大写B)变体可能通过此条件所做的标题测试获得,并且bangles 版本将由页面名称slug test获取。一个,另一个,也不是两者都像预期的那样工作。

在任何情况下OTHER CODE TO RUN 是将要运行的。

我是不是看过头了?与Woocommerce产品归档页面相比,这是否有可能只对实际的Wordpress页面进行有条件的测试?

如果有帮助,下面是放置此条件的环绕码。

<?php
if ( function_exists( \'wc_the_product_table\' ) ) {

    if (is_page(\'Bangles\',\'bangles\')) {

echo "test";

    } else {
        $shortcode = \'[product_table columns="image:blank,sku,name,weight,dimensions,price:Est. Cost,add-to-cart:Add?" sort="sku" variations="separate" links="none" filters="true" cart_button="checkbox" priorities="1,6,2,4,3,1" ajax_cart="true" show_footer="true" paging_type="full_numbers" product_limit="600" rows_per_page="50"]\';
    }

    /**
     * Don\'t modify anything below here unless you know what you\'re doing!
     */
    $args = shortcode_parse_atts( str_replace( array( \'[product_table \', \']\' ), \'\', $shortcode ) );

    if ( is_product_category() ) {
        // Product category archive
        $args[\'category\'] = get_queried_object_id();
    } elseif ( is_product_tag() ) {
        // Product tag archive
        $args[\'tag\'] = get_queried_object_id();
    } elseif ( is_product_taxonomy() ) {
        // Other product taxonomy archive
        $term            = get_queried_object();
        $args[\'term\']    = "{$term->taxonomy}:{$term->term_id}";
    } elseif ( is_post_type_archive( \'product\' ) && get_query_var( \'s\' ) ) {
        // Product search results page
        add_filter( \'wc_product_table_run_in_search\', \'__return_true\' );

        if ( have_posts() ) {
            global $wp_query;
            $args[\'include\'] = wp_list_pluck( $wp_query->posts, \'ID\' );
        } else {
            // Force \'nothing found\' message if no posts in query
            $args[\'include\'] = -1;
        }
    }

    // Display the product table
    wc_the_product_table( $args );
} elseif ( have_posts() ) {
更新:因此,我找到了一个解决方案来实现我想要实现的目标。然而,我仍然想理解为什么上述方法不起作用。我想知道我误解了什么is_page 功能。

我找到的解决方案是使用has_term 有条件的就我而言,我用过,if ( has_term (\'bangles\',\'product_cat\')) { 这就成功了

正如Jacob所指出的,我的更新使用了错误的方法。在他的帮助下,我想到的是:(测试当前产品类别是否是父母中任何一方的孩子)

$id = get_queried_object_id();
$ancestors = get_ancestors( $id, \'product_cat\', \'taxonomy\' );
if (in_array("94", $ancestors) || in_array("19", $ancestors)) {

echo "true";

    } else {

echo "false";

    }

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

“手镯”不是一页。这是一个产品类别归档。is_page() 检查:

是否查询现有的单个页面?

哪些产品类别不是。请参见Template Hierarchy 了解WordPress中不同类型的“页面”。

如果要检查是否正在查看产品类别存档,请使用is_tax(), 哪些检查:

是否查询现有自定义分类法存档页?

所以你可以这样使用它:

if ( is_tax( \'product_cat\', \'bangles\' ) ) {

}
WooCommerce还提供自己的conditional tags, 包括用于检查产品类别的功能,is_product_category():

if ( is_product_category( \'bangles\' ) ) {

}
关于您的编辑,has_term 也不正确。该功能用于检查单个帖子是否具有bangles 类别在存档中,这将检查列表中的第一篇文章/产品。虽然这在手镯类别页面上是正确的,但由于该类别中的所有产品都有该类别,如果该类别中的产品碰巧也在手镯类别中,则在其他类别上也是正确的。

这里重要的是WordPress提供不同类型的内容,主要是帖子和档案,并且有不同类型的帖子和档案。在WordPress中,“页面”是一种帖子类型。产品也是如此。如果要检查哪个“页面”(在web浏览器的意义上),需要知道要查找的内容类型,并使用适当的功能。

结束

相关推荐