wordpress 在Woocommerce中覆盖Avada目录排序挂钩回到默认值

fnatzsnv  于 2022-12-26  发布在  WordPress
关注(0)|答案(3)|浏览(183)

我试图修改Woocommerce排序选项,以获得一个定制的,通过添加以下代码到Avada子function.php文件:

// add custom sorting option 
   add_filter( 'woocommerce_get_catalog_ordering_args', 
  'custom_woocommerce_get_catalog_ordering_args' );

  function custom_woocommerce_get_catalog_ordering_args( $args ) {
  $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( 
  $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', 
  get_option( 'woocommerce_default_catalog_orderby' ) );

  if ( 'random_list' == $orderby_value ) {
 $args['orderby'] = 'menu_order Date';
    $args['order'] = 'ASC';
    $args['meta_key'] = '';
    }

return $args;
}

add_filter( 'woocommerce_default_catalog_orderby_options', 
'custom_woocommerce_catalog_orderby' );
 add_filter( 'woocommerce_catalog_orderby', 
 'custom_woocommerce_catalog_orderby' );

 function custom_woocommerce_catalog_orderby( $sortby ) {
$sortby['random_list'] = 'Menu_order_date';
return $sortby;
}
//end custom ordering code

如果我没有启用WooCommerce商店页面订购框,实际上我想订购框显示在我的商店页面和产品类别,所以我联系Avada支持这个问题,原来Avada使用自己的挂钩WooCommerce商店页面订购框与以下代码:

/**
 * Controls the actions adding the ordering boxes.
 *
 * @access public
 * @since 5.0.4
 * @param object $query The main query.
 * @return void
 */
public function product_ordering( $query ) {

    // We only want to affect the main query.
    if ( ! $query->is_main_query() || $query->is_search() ) {
        return;
    }

    if ( $query->get( 'page_id' ) ) {
        $page_id = absint( $query->get( 'page_id' ) );
    } else {
        $page_id = absint( Avada()->fusion_library->get_page_id() );
    }

    if ( wc_get_page_id( 'shop' ) === $page_id || $query->is_post_type_archive( 'product' ) || $query->is_tax( get_object_taxonomies( 'product' ) ) ) {

        if ( Avada()->settings->get( 'woocommerce_avada_ordering' ) ) {
            remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
            add_action( 'woocommerce_before_shop_loop', array( $this, 'catalog_ordering' ), 30 );

            add_action( 'woocommerce_get_catalog_ordering_args', array( $this, 'get_catalog_ordering_args' ), 20 );
        }
    }
}

Avada支持说我可以从这个钩子中删除Avada函数,并添加我自己的Using Child主题。

add_action( 'woocommerce_get_catalog_ordering_args', array( $this, 
'get_catalog_ordering_args' ), 20 );

我找遍了互联网寻求帮助,我发现许多人问了几乎相同的问题,但没有答案。
如果任何人可以帮助删除avada功能,这将是非常有帮助的我和其他人谁正在寻找,以及。
如何从woocommerce_get_catalog_ordering_args操作钩子中删除Avada钩子函数?
经过几次测试后,我发现Avada团队添加了以下代码:

/**
 * Modified the ordering of products.
 *
 * @access public
 * @since 5.1.0
 */
public function catalog_ordering() {
    get_template_part( 'templates/wc-catalog-ordering' );
}

/**
 * Gets the catalogue ordering arguments.
 *
 * @access public
 * @since 5.1.0
 * @param array $args The arguments.
 * @return array
 */
function get_catalog_ordering_args( $args ) {
    global $woocommerce;
    $woo_default_catalog_orderby = get_option( 'woocommerce_default_catalog_orderby' );

    // Get the query args.
    if ( isset( $_SERVER['QUERY_STRING'] ) ) {
        parse_str( sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ), $params );
    }

    // Get order by.
    $pob = ( ! empty( $params['product_orderby'] ) ) ? $params['product_orderby'] : $woo_default_catalog_orderby;

    // Get order.
    $po = 'asc';
    if ( isset( $params['product_order'] ) ) {
        // Dedicated ordering.
        $po = $params['product_order'];
    } else {
        // Get the correct default order.
        $po = 'asc';
        if ( 'date' === $pob || 'popularity' === $pob || 'rating' === $pob || 'price-desc' === $pob ) {
            $po = 'desc';
        }
    }

    // Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'date';
    $order    = strtoupper( $po );
    $meta_key = '';

    switch ( $pob ) {
        case 'menu_order':
        case 'default':
            $orderby  = $args['orderby'];
            break;
        case 'date':
            $orderby  = 'date';
            break;
        case 'price':
        case 'price-desc':
            add_filter( 'posts_clauses', array( $this, 'order_by_price_post_clauses' ) );
            add_action( 'wp', array( $this, 'remove_ordering_args_filters' ) );
            break;
        case 'popularity':
            $meta_key = 'total_sales';
            add_filter( 'posts_clauses', array( $this, 'order_by_popularity_post_clauses' ) );
            add_action( 'wp', array( $this, 'remove_ordering_args_filters' ) );
            break;
        case 'rating':
            $meta_key = '_wc_average_rating';
            $orderby  = array(
                'meta_value_num' => strtoupper( $po ),
                'ID'             => 'ASC',
            );
            break;
        case 'name':
            $orderby  = 'title';
            break;
    }

    $args['orderby']  = $orderby;
    $args['order']    = $order;
    $args['meta_key'] = $meta_key;

    return $args;
}

如果我只修改以下内容:

// Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'date';
    $order    = strtoupper( $po );
    $meta_key = '';

// Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'menu_order Date';
    $order    = strtoupper( $po );
    $meta_key = '';

$orderby = '菜单订单日期';而不是$orderby = '日期';
这只是我强迫avada使用我自己的自定义排序,而不是日期。
但这不是真正实用的解决方案,因为我修改了class-avada-woocommerce.php
是否有任何建议通过添加一些代码到avada子对象来找到解决方案

a0zr77ik

a0zr77ik1#

阿瓦达法典没有错。
Avada故意断开过滤器“woocommerce_get_catalog_ordering_args”,并在“/wp-content/themes/Avada/includes/class-avada-woocommerce.php”中写入自己的过滤器“catalog_ordering”
那叫
'/wp-content/themes/avada/模板/wc目录排序. php'
请使用您的子主题并复制wc-catalog-ordering.php中的内容来覆盖模板。
即“/wp-内容/主题/Avada-儿童主题/模板/wc-目录-订单. php”
一旦完成,您就可以按照自己的意愿处理订单。
前面提到过,函数“remove_avada_function”被挂接在“after_setup_theme”上,用于删除挂接。但是,由于“remove_avada_function”是在调用操作“pre_get_post”之前调用的,因此“remove_avada_function”不会删除当前不存在的操作。

kiz8lqtg

kiz8lqtg2#

    • 更新2:**

我认为如果你添加一个比Avada的主题挂钩更高的优先级,它会工作(这里我把它设置为100),并且在这个函数中要做的唯一改变是$args['orderby'] = 'menu_order date';,以获得你在Avada的文件上所做的类似改变。
代码:

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args', 100 );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
    $args['orderby'] = 'menu_order date';
    return $args;
}

此代码位于当前子主题的function.php文件中。
应该可以
非常奇怪的是,woocommerce_get_catalog_ordering_args是一个过滤器钩子,但不是一个操作钩子(所以我修改了代码)...
那么Avada的主题代码中有问题,您应该向支持部门报告
你只需要增加你的hooked函数,这样它就会覆盖Avada的:

add_action('after_setup_theme', 'remove_avada_function' );
function remove_avada_function(){
    remove_action( 'woocommerce_before_shop_loop', 'catalog_ordering', 30 );
    add_action( 'woocommerce_before_shop_loop', 'custom_catalog_ordering', 30 );
}
ghg1uchk

ghg1uchk3#

您可以使用此代码将Avada目录排序挂钩设置回woocommerce默认值。

function avada_remove_ordering() {
  global $avada_woocommerce;
  remove_action('pre_get_posts', array( $avada_woocommerce, 'product_ordering' ), 5);
  add_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
}
add_action( 'init', 'avada_remove_ordering'  );

add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_woocommerce_get_catalog_ordering_args' , 12);
function custom_woocommerce_get_catalog_ordering_args( $args ) {

$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
  if ( 'sale_price' == $orderby_value ) {
    
    $args['orderby'] = 'meta_value_num';
    $args['order'] = 'ASC';
    $args['meta_key'] = '_sale_price';

  }
  return $args;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'custom_woocommerce_catalog_orderby', 12 );
add_filter( 'woocommerce_catalog_orderby', 'custom_woocommerce_catalog_orderby', 12 );
function custom_woocommerce_catalog_orderby( $sortby ) {
  $sortby['sale_price'] = 'Sale';
  return $sortby;
}

相关问题