WooCommerce自定义产品列可排序支持不工作
我有一个自定义postmeta
字段,它以序列化方式存储post/product_id。示例_related_ids
=>a:4:{i:0;i:2462;i:1;i:2466;i:2;i:2469;i:3;i:2472;}
WooCommerce自定义产品列可排序支持不工作
我在WooCommerce产品清单屏幕(支持)中显示_related_ids
的product_id计数,该工作正常。现在我想让这个列可排序。所以我写了一个函数related_product_col_sort
,这个函数连接到manage_edit-product_sortable_columns
。列短路不起作用。 (不工作意味着它没有正确订购product_id计数)。
这里是我完整的代码
//_related_ids => a:4:{i:0;i:2462;i:1;i:2466;i:2;i:2469;i:3;i:2472;}
//manage_product_posts_custom_column
add_filter('manage_edit-product_columns', 'related_product_col');
function related_product_col($columns) {
$new_columns = (is_array($columns)) ? $columns : array();
$new_columns['RELATED'] = 'Related Product';
return $new_columns;
}
add_action('manage_product_posts_custom_column', 'related_product_col_data', 2);
function related_product_col_data($column) {
global $post;
$related_product_ids = get_post_meta($post->ID, '_related_ids', true);
if ($column == 'RELATED') {
if (isset($related_product_ids) && !empty($related_product_ids)) {
echo count($related_product_ids);
} else {
echo "--";
}
}
}
add_filter("manage_edit-product_sortable_columns", 'related_product_col_sort');
function related_product_col_sort($columns) {
$custom = array(
'RELATED' => '_related_ids'
);
return wp_parse_args($custom, $columns);
}
谁能帮我用related_product_col_sort
功能正确的逻辑/代码。
谢谢。
Long答案总之 - 基本上,如果您需要对meta_value进行排序,则无法将其序列化。检查https://wordpress.stackexchange.com/questions/87265/order-by-meta-value-serialized-array。
我认为最适合您的解决方案是将相关产品的数量存储在新的meta_key中,并使用它对列进行排序。
如果列包含普通数据而不是序列化数组,则下面是对数据进行排序的步骤。
实际上有两个步骤,以使自定义列排序
- 注册为排序
- 实现排序逻辑
要注册列排序您使用manage_{YOUR_SCREEN_ID}_sortable_columns
过滤器列并添加您的列
您已使用related_product_col_sort
函数注册您的列,以执行根据数据类型的不同,排序功能有几种方法。
如果数据是数字或简单的字母可以使用pre_get_posts
行动,并设置meta_key
和orderby
值
add_action('pre_get_posts', 'manage_wp_posts_my_custom_pre_get_posts', 1);
function manage_wp_posts_my_custom_pre_get_posts($query) {
/**
* We only want our code to run in the main WP query
* AND if an orderby query variable is designated.
*/
if ($query->is_main_query() && ($orderby = $query->get('orderby'))) {
switch($orderby) {
// If we're ordering by 'film_rating'
case 'RELATED':
// set our query's meta_key, which is used for custom fields
$query->set('meta_key', 'RELATED');
/**
* Tell the query to order by our custom field/meta_key's
* This will only work is the meta_value for the RELATED key is either a number or a simple string
*/
$query->set('orderby', 'meta_value');
break;
}
}
}
如果你的排序值是比较复杂的像一个日期
add_filter('posts_clauses', 'manage_wp_posts_my_custom_posts_clauses', 1, 2);
function manage_wp_posts_my_custom_posts_clauses($pieces, $query) {
global $wpdb;
/**
* We only want our code to run in the main WP query
* AND if an orderby query variable is designated.
*/
if ($query->is_main_query() && ($orderby = $query->get('orderby'))) {
// Get the order query variable - ASC or DESC
$order = strtoupper($query->get('order'));
// Make sure the order setting qualifies. If not, set default as ASC
if (! in_array($order, array('ASC', 'DESC')))
$order = 'ASC';
switch($orderby) {
// If we're ordering by release_date
case 'RELATED':
/**
* We have to join the postmeta table to
* include our release date in the query.
*/
$pieces[ 'join' ] .= " LEFT JOIN $wpdb->postmeta wp_rd ON wp_rd.post_id = {$wpdb->posts}.ID AND wp_rd.meta_key = '_related_ids'";
// This will only work if the meta_value is a date.
$pieces[ 'orderby' ] = "STR_TO_DATE(wp_rd.meta_value,'%m/%d/%Y') $order, " . $pieces[ 'orderby' ];
break;
}
}
return $pieces;
}
我想我明白了我错在哪里,会尝试一下并且会更新你。而且我正在使用相关产品插件以序列化方式存储值,我想我必须编辑该插件以使排序逻辑更容易。谢谢。 –