按自定义元值排序在 WooCommerce 产品中不起作用
Sort by custom meta value doesn't work in WooCommerce products sort by
我正在尝试为 woocommerce 产品列表添加排序选项。
目标是使用名为 _rating.
的元键按元值对产品进行排序 现在,我使用在插件激活时执行的函数生成此元值。
问题:
产品不是按元值排序,而是按 ID 排序
我的插件:
<?php
/*
Plugin Name: Sort by meta value
Description: Add sort option in product list by meta ratings
Author: Aurélien
Version: 1.0.0
Text Domain: sort-by-meta
Domain Path: /languages
*/
/**
* Check if WooCommerce is active
**/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
class Sort_By_Meta{
public static function init()
{
//Add custom fields for every product
$all_ids = get_posts( array(
'post_type' => 'product',
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
) );
foreach ( $all_ids as $id ) {
update_post_meta($id,"_rating", Sort_By_Meta::generateRandomString());
}
}
//Function which generates random string
public function generateRandomString($length = 10) {
$characters = 'abcdefghijklmnopqrstuvwxyz';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
}
register_activation_hook( __FILE__, array('Sort_By_Meta', 'init' ));
function add_postmeta_ordering_args( $sort_args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
switch( $orderby_value ) {
case 'rating':
$sort_args['orderby'] = 'meta_value';
$sort_args['order'] = 'DESC';
$sort_args['meta_key'] = '_rating';
break;
}
return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'add_postmeta_ordering_args' );
function add_new_postmeta_orderby( $sortby ) {
$sortby['rating'] = "rating";
return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'add_new_postmeta_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'add_new_postmeta_orderby' );
}
我测试了你的代码,乍一看似乎没有什么问题,但并没有得到预期的结果。当我用 rank
之类的东西替换 rating
时
这似乎有效。
这是因为 rating
已被“按平均评分排序”使用
function add_postmeta_ordering_args( $sort_args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
switch( $orderby_value ) {
case 'rank':
$sort_args['orderby'] = 'meta_value';
$sort_args['order'] = 'ASC';
$sort_args['meta_key'] = '_rating';
break;
}
return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'add_postmeta_ordering_args', 10, 1 );
function add_new_postmeta_orderby( $sortby ) {
$sortby['rank'] = 'Rating';
return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'add_new_postmeta_orderby', 10, 1 );
add_filter( 'woocommerce_catalog_orderby', 'add_new_postmeta_orderby', 10, 1 );
我正在尝试为 woocommerce 产品列表添加排序选项。
目标是使用名为 _rating.
的元键按元值对产品进行排序 现在,我使用在插件激活时执行的函数生成此元值。
问题:
产品不是按元值排序,而是按 ID 排序
我的插件:
<?php
/*
Plugin Name: Sort by meta value
Description: Add sort option in product list by meta ratings
Author: Aurélien
Version: 1.0.0
Text Domain: sort-by-meta
Domain Path: /languages
*/
/**
* Check if WooCommerce is active
**/
if ( in_array( 'woocommerce/woocommerce.php', apply_filters( 'active_plugins', get_option( 'active_plugins' ) ) ) ) {
class Sort_By_Meta{
public static function init()
{
//Add custom fields for every product
$all_ids = get_posts( array(
'post_type' => 'product',
'numberposts' => -1,
'post_status' => 'publish',
'fields' => 'ids',
) );
foreach ( $all_ids as $id ) {
update_post_meta($id,"_rating", Sort_By_Meta::generateRandomString());
}
}
//Function which generates random string
public function generateRandomString($length = 10) {
$characters = 'abcdefghijklmnopqrstuvwxyz';
$charactersLength = strlen($characters);
$randomString = '';
for ($i = 0; $i < $length; $i++) {
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
}
register_activation_hook( __FILE__, array('Sort_By_Meta', 'init' ));
function add_postmeta_ordering_args( $sort_args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
switch( $orderby_value ) {
case 'rating':
$sort_args['orderby'] = 'meta_value';
$sort_args['order'] = 'DESC';
$sort_args['meta_key'] = '_rating';
break;
}
return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'add_postmeta_ordering_args' );
function add_new_postmeta_orderby( $sortby ) {
$sortby['rating'] = "rating";
return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'add_new_postmeta_orderby' );
add_filter( 'woocommerce_catalog_orderby', 'add_new_postmeta_orderby' );
}
我测试了你的代码,乍一看似乎没有什么问题,但并没有得到预期的结果。当我用 rank
之类的东西替换 rating
时
这似乎有效。
这是因为 rating
已被“按平均评分排序”使用
function add_postmeta_ordering_args( $sort_args ) {
$orderby_value = isset( $_GET['orderby'] ) ? wc_clean( $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', get_option( 'woocommerce_default_catalog_orderby' ) );
switch( $orderby_value ) {
case 'rank':
$sort_args['orderby'] = 'meta_value';
$sort_args['order'] = 'ASC';
$sort_args['meta_key'] = '_rating';
break;
}
return $sort_args;
}
add_filter( 'woocommerce_get_catalog_ordering_args', 'add_postmeta_ordering_args', 10, 1 );
function add_new_postmeta_orderby( $sortby ) {
$sortby['rank'] = 'Rating';
return $sortby;
}
add_filter( 'woocommerce_default_catalog_orderby_options', 'add_new_postmeta_orderby', 10, 1 );
add_filter( 'woocommerce_catalog_orderby', 'add_new_postmeta_orderby', 10, 1 );