在 Woocommerce 产品类别档案中加载特定元素

Posted

技术标签:

【中文标题】在 Woocommerce 产品类别档案中加载特定元素【英文标题】:Load specific element on Woocommerce product category archives 【发布时间】:2019-07-17 23:47:42 【问题描述】:

他们是不是通过functions.php或其他php方法在woocommerce的商店/主页上不加载特定的div元素?

<div id="nm-shop" class="nm-shop nm-shop-sidebar-header images-lazyload images-show" style="min-height: 288px;">

    ...
</div>

此代码包含一个过滤器和我的商店页面的产品档案,但我只想在已经可以使用的类别页面上显示它,而不是在主页上。如何停止在商店/主页上加载此 div 元素?我知道可以通过 css display:none; 实现,但这不是最干净的解决方案。

我在 archive-product.php 中找到了 div 类,但我不确定它是否已定义为在商店页面上加载它。

<div id="nm-shop" class="nm-shop <?php echo esc_attr( $shop_class ); ?>">
    <?php
        /**
         * Hook: woocommerce_before_main_content.
         *
         * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
         * NM: Removed - @hooked woocommerce_breadcrumb - 20
         * @hooked WC_Structured_Data::generate_website_data() - 30
         */
        do_action( 'woocommerce_before_main_content' );
    ?>

    <?php 
        // Shop header
        if ( $nm_theme_options['shop_header'] ) 
            wc_get_template_part( 'content', 'product_nm_header' );
        
    ?>

    <?php nm_print_shop_notices(); // Note: Don't remove (WooCommerce will output multiple messages otherwise) ?>

    <div id="nm-shop-products" class="nm-shop-products">
        <div class="nm-row">
            <?php 
                if ( $show_filters_sidebar ) 
                    /**
                     * woocommerce_sidebar hook.
                     *
                     * @hooked woocommerce_get_sidebar - 10
                     */
                    do_action( 'woocommerce_sidebar' );
                
            ?>

            <div class="nm-shop-products-col <?php echo esc_attr( $shop_column_size ); ?>">
                <div id="nm-shop-products-overlay" class="nm-loader"></div>
                <div id="nm-shop-browse-wrap" class="nm-shop-description-<?php echo esc_attr( $nm_theme_options['shop_description_layout'] ); ?>">
                    <?php
                        // Results bar/button
                        wc_get_template_part( 'content', 'product_nm_results_bar' );
                    ?>

                    <?php
                        // Taxonomy description
                        if ( $show_taxonomy_description ) 
                            if ( $is_product_taxonomy ) 
                                /**
                                 * Hook: woocommerce_archive_description.
                                 *
                                 * @hooked woocommerce_taxonomy_archive_description - 10
                                 * @hooked woocommerce_product_archive_description - 10
                                 */
                                do_action( 'woocommerce_archive_description' );
                             else if ( strlen( $nm_theme_options['shop_default_description'] ) > 0 && ! isset( $_REQUEST['s'] ) )  // Don't display on search
                                // Default description
                                nm_shop_description( $nm_theme_options['shop_default_description'] );
                            
                        
                    ?>

                    <?php
                    if ( woocommerce_product_loop() ) 
                        /**
                         * Hook: woocommerce_before_shop_loop.
                         *
                         * @hooked wc_print_notices - 10
                         * NM: Removed - @hooked woocommerce_result_count - 20
                         * NM: Removed - @hooked woocommerce_catalog_ordering - 30
                         */
                        do_action( 'woocommerce_before_shop_loop' );

                        // Set column sizes
                        global $woocommerce_loop;
                        $woocommerce_loop['columns'] = $nm_theme_options['shop_columns'];
                        $woocommerce_loop['columns_small'] = '2';
                        $woocommerce_loop['columns_medium'] = '3';

                        woocommerce_product_loop_start();

                        $nm_globals['is_categories_shortcode'] = false;

                        if ( wc_get_loop_prop( 'total' ) ) 
                            while ( have_posts() ) 
                                the_post();

                                // Note: Don't place in another template (image lazy-loading is only used in the Shop and WooCommerce shortcodes can use the other product templates)                 
                                $nm_globals['shop_image_lazy_loading'] = ( $nm_theme_options['product_image_lazy_loading'] ) ? true : false;

                                /**
                                 * Hook: woocommerce_shop_loop.
                                 *
                                 * @hooked WC_Structured_Data::generate_product_data() - 10
                                 */
                                do_action( 'woocommerce_shop_loop' );

                                wc_get_template_part( 'content', 'product' );
                            
                        

                        woocommerce_product_loop_end();

                        /**
                         * Hook: woocommerce_after_shop_loop.
                         *
                         * @hooked woocommerce_pagination - 10
                         */
                        do_action( 'woocommerce_after_shop_loop' );
                     else 
                        /**
                         * Hook: woocommerce_no_products_found.
                         *
                         * @hooked wc_no_products_found - 10
                         */
                        do_action( 'woocommerce_no_products_found' );
                    
                    ?>
                </div>
            </div>
        </div>

        <?php
            /**
             * Hook: woocommerce_after_main_content.
             *
             * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
             */
            do_action( 'woocommerce_after_main_content' );
        ?>
    </div>

    <?php
        // Sidebar/filters popup
        if ( $show_filters_popup ) 
            wc_get_template_part( 'content', 'product_nm_filters_popup' );
        
    ?>

</div>

<?php
    /**
     * Hook: nm_after_shop.
     */
    do_action( 'nm_after_shop' );

    get_footer( 'shop' );
?>

【问题讨论】:

【参考方案1】:

这很容易。只需创建一个单独的文件.php,如下所示

<div id="nm-shop" class="nm-shop nm-shop-sidebar-header images-lazyload images-show" style="min-height: 288px;">
...
</div>

然后您可以将它包含在页面中您想要的位置,只需执行以下操作:

include 'name_of_your_file.php';

如果您有任何问题,请联系文档:http://php.net/manual/en/function.include.php

【讨论】:

【参考方案2】:

您可以使用woocommerce conditional tag is_product_category() 仅定位产品类别档案页面,这样:

<?php if( is_product_category() ) : ?>
<div id="nm-shop" class="nm-shop nm-shop-sidebar-header images-lazyload images-show" style="min-height: 288px;">
    ...
</div>
<?php endif; ?>

应该可以的

【讨论】:

感谢反馈,这是在 function.php 中出现的吗?我正在使用我尝试修改的主题。我在archive-product.php 中找到了它的代码。我用代码更新了我的帖子。也许有一个钩子定义它应该在商店页面上加载它。到目前为止找不到任何东西。

以上是关于在 Woocommerce 产品类别档案中加载特定元素的主要内容,如果未能解决你的问题,请参考以下文章

php [WooCommerce Core]隐藏产品档案中的子类别产品计数

php [WooCommerce Core]隐藏产品档案中的子类别产品计数

在WordPress中加载模板而不回显它

从类别中加载所有产品并按 Magento 中选定的多选属性进行过滤

在 WordPress 中加载模板而不回显它

在 WooCommerce 产品循环中显示特定类别的产品属性值