有没有办法在所有标题中显示商店页面的WooCommerce NAV过滤器小部件过滤器?

时间:2013-09-03 作者:Gman

我试图在主页上显示Woocommerce导航过滤器,以便访问者可以过滤任何页面上的所有商店产品(当他们点击过滤器时,他们将像往常一样被带到商店页面)。我想要的是将其包含在标题中以实现这一点,但它不起作用。

据我所知,它仅在加载车间循环时加载。我试图做一个自定义循环,但没有成功。

3 个回复
最合适的回答,由SO网友:Gman 整理而成

我没有找到任何关于如何做到这一点的文档。因此,我周围的工作开始了。

在函数中注册侧栏。php文件(您可以将名称更改为您想要的任何名称):

function meir_widgets_init() {
    register_sidebar( array(
        \'name\' => \'Filters Sidebar\',
        \'id\' => \'filters-sidebar\',
        \'description\' => \'Sidebar for top filters.\',
        \'before_widget\' => \'<div id="%1$s" class="widget %2$s">\',
        \'after_widget\' => \'<div class="clear"></div></div></div></div>\',
        \'before_title\' => \'<h3 class="widget-title">\',
        \'after_title\' => \'</h3><div class="filter_box"><div class="filter_wrapper">\',
    ) );
add_action( \'widgets_init\', \'meir_widgets_init\' );
功能结束时。php文件:

if (!is_admin()) {
function woocommerce_price_filter_init2() {
    global $woocommerce;

    //if ( is_active_widget( false, false, \'price_filter\', true ) && ! is_admin() ) {

        $suffix = defined( \'SCRIPT_DEBUG\' ) && SCRIPT_DEBUG ? \'\' : \'.min\';

        wp_register_script( \'wc-price-slider\', plugins_url(\'/woocommerce/assets/js/frontend/price-slider\' . $suffix . \'.js\', __FILE__));
        wp_enqueue_script(\'wc-price-slider\',\'\',true);
//      array( \'jquery-ui-slider\' ), \'1.6\', true );

    wp_enqueue_script(\'jquery-ui-slider\', false, array(\'jquery\'), false, true);

        add_filter( \'loop_shop_post_in\', \'woocommerce_price_filter\' );
    //}
}

add_action( \'init\', \'woocommerce_price_filter_init2\' );
}


function my_plugin_body_class($classes) {
    $classes[] = \'woocommerce\';
    $classes[] = \'woocommerce-page\';
    return $classes;
}

add_filter(\'body_class\', \'my_plugin_body_class\');
然后在模板内创建一个名为cache-woocommerce-nav-filter

在模板页面中,您希望显示自定义过滤器(本例中,我们的侧栏命名为过滤器侧栏,但可以更改为任何其他内容:

if(!function_exists(\'dynamic_sidebar\')){

        }

        else{

            $hrcachfold = plugin_dir_path( __FILE__ )."cache-woocommerce-nav-filter/";
            $hrcachefile = $hrcachfold.date("YmdH")."-cache.php";
            $shop_page_url = get_permalink( woocommerce_get_page_id( \'shop\' ) );
            $actual_link = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];

            if ( is_shop() ) {
                if ( ($actual_link == $shop_page_url) AND !file_exists($hrcachefile) ) {

                    foreach ( glob ( $hrcachfold."*-cache.php" ) as $v ) {
                        unlink ($v);
                    }

                    ob_start();

                    dynamic_sidebar(\'filters-sidebar\');

                    $content = ob_get_contents();

                    $f = fopen( $hrcachefile, "w" );

                    fwrite( $f, $content );

                    fclose($f);ob_end_clean();
                }

                dynamic_sidebar(\'filters-sidebar\');         
            }

            else {

                $shoppage = file_get_contents($shop_page_url);

                if ( ($actual_link == $shop_page_url) AND !file_exists($hrcachefile) ) {

                    foreach ( glob ( $hrcachfold."*-cache.php" ) as $v ) {

                        unlink ($v);

                    }

                    ob_start();

                    dynamic_sidebar(\'filters-sidebar\');

                    $content = ob_get_contents();

                    $f = fopen ( $hrcachefile, "w" );

                    fwrite( $f, $content );

                    fclose ($f);

                    ob_end_clean();
                }

                include($hrcachefile);
            }

        }

SO网友:Prince Singh

在wp内容/插件/woocommerce/类/小部件中查找这段代码

if ( ! is_post_type_archive( \'product\' ) && is_array( $_attributes_array ) && ! is_tax( array_merge( $_attributes_array, array( \'product_cat\', \'product_tag\' ) ) ) )
            return;
并将其移除。

Yur小部件现在应该显示在每个页面上

SO网友:djboris

我刚刚遇到了同样的问题,下面是我如何解决它的。正如OP所述,这里真正的问题是,WC过滤器仅在主查询加载产品时工作。所以,打电话do_action( \'woocommerce_sidebar\' ); 没有适当的全局WP_Query and WC_Query 加载通常不起任何作用。

所以我创建了这个助手函数:

<?php
function wpse112648_woo_sidebar() {
    global $wp_query;

    // Get our products
    $wp_query = new WP_Query( [
        \'cache_results\' => 1,
        \'post_type\' => \'product\',
        \'tax_query\' => [
            \'relation\' => \'AND\',
            [
                \'taxonomy\' => \'product_visibility\',
                \'field\'    => \'term_taxonomy_id\',
                \'terms\'    => [
                    13,
                ],
                \'operator\' => \'NOT IN\'
            ],
        ],
    ] );

    // Load the WC instance with our query
    wc()->query->product_query( $wp_query );

    // Call our sidebar
    do_action( \'woocommerce_sidebar\' ); // or: dynamic_sidebar(\'your-registered-sidebar\');

    // Cover our tracks
    wp_reset_query();
}
现在,在每个要显示侧栏的页面模板上,只需调用以下函数:wpse112648_woo_sidebar()

结束