当WooCommerce中的字母和数字的标题由自定义排序产品
所以,我做了一些挖掘,但无法找到正确的方法来做到这一点。当WooCommerce中的字母和数字的标题由自定义排序产品
我在WooCommerce(Wordpress)上有一些产品,但是他们的标题由字母和数字组成。 我需要这些产品是打印这样的(如):
FNC21000-C
FNC24500-C
FNC232500-C
但是,当然,WordPress的给我:
FNC21000 -C
FNC232500-C
FNC24500-C
反正是有阿赫即使这样?
我认为我可能会在WP_Query上做些什么,但我真的是PHP的新手,我知道一些可能的修补程序在PHP上,其他一些在MySQL上......以及标题为BOTH字符串和整数,让我觉得无法写如何...
有没有人有一些建议?
下面,类-WC-query.php,我认为是我需要编辑文件:
/**
* Returns an array of arguments for ordering products based on the selected values.
*
* @access public
* @return array
*/
public function get_catalog_ordering_args($orderby = '', $order = '') {
// Get ordering from query string unless defined
if (! $orderby) {
$orderby_value = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
// Get order + orderby args from string
$orderby_value = explode('-', $orderby_value);
$orderby = esc_attr($orderby_value[0]);
$order = ! empty($orderby_value[1]) ? $orderby_value[1] : $order;
}
$orderby = strtolower($orderby);
$order = strtoupper($order);
$args = array();
// default - menu_order
$args['orderby'] = "strlen('title') => 'ASC', 'title' => 'ASC'";
// $args['orderby'] = 'title';
$args['order'] = $order == 'DESC' ? 'DESC' : 'ASC';
$args['meta_key'] = '';
switch ($orderby) {
case 'rand' :
$args['orderby'] = 'rand';
break;
case 'date' :
$args['orderby'] = 'date ID';
$args['order'] = $order == 'ASC' ? 'ASC' : 'DESC';
break;
case 'price' :
$args['orderby'] = "meta_value_num ID";
$args['order'] = $order == 'DESC' ? 'DESC' : 'ASC';
$args['meta_key'] = '_price';
break;
case 'popularity' :
$args['meta_key'] = 'total_sales';
// Sorting handled later though a hook
add_filter('posts_clauses', array($this, 'order_by_popularity_post_clauses'));
break;
case 'rating' :
// Sorting handled later though a hook
add_filter('posts_clauses', array($this, 'order_by_rating_post_clauses'));
break;
case 'title' :
$args['orderby'] = "strlen('title') => 'ASC', 'title' => 'ASC'";
//$args['orderby'] = 'meta_value meta_value_num title';
$args['order'] = $order == 'DESC' ? 'DESC' : 'ASC';
break;
}
return apply_filters('woocommerce_get_catalog_ordering_args', $args);
}
在PHP中,只需调用natsort()。
代码:(Demo)
$array=['FND100000-C','FNC24500-C','FNC232500-C','FMC30000-C','FNC21000-C'];
natsort($array);
var_export($array);
输出:
array (
3 => 'FMC30000-C',
4 => 'FNC21000-C',
1 => 'FNC24500-C',
2 => 'FNC232500-C',
0 => 'FND100000-C',
)
在MySQL,只要格式是...
- 3个字母然后
- 一个系列号码
- 一个连字符,然后
- 一个或多个字符
...你可以订购通过调用SUBSTRING()和SUBSTRING_INDEX()
表&查询:(Demo)
CREATE TABLE `test` (
`PrdID` varchar(50) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO `test` (`PrdID`) VALUES
('FMC30000-C'),
('FNC21000-B'),
('FNC21000-C'),
('FNC232500-C'),
('FNC24500-C'),
('FND100000-C');
ALTER TABLE `test`
ADD PRIMARY KEY (`PrdID`);
SELECT PrdID,
SUBSTRING(PrdID,1,3),
SUBSTRING(SUBSTRING_INDEX(PrdID,'-',1),4),
SUBSTRING_INDEX(PrdID,'-',-1)
FROM `test`
ORDER BY
SUBSTRING(PrdID,1,3),
CAST(SUBSTRING(SUBSTRING_INDEX(PrdID,'-',1),4) AS UNSIGNED),
SUBSTRING_INDEX(PrdID,'-',-1)
输出:
PrdID | SUBSTRING(PrdID,1,3) | SUBSTRING(SUBSTRING_INDEX(PrdID,'-',1),4) | SUBSTRING_INDEX(PrdID,'-',-1)
----------------------------------------------------------------------------------------------------------------
FMC30000-C | FMC | 30000 | C
FNC21000-B | FNC | 21000 | B
FNC21000-C | FNC | 21000 | C
FNC24500-C | FNC | 24500 | C
FNC232500-C | FNC | 232500 | C
FND100000-C | FND | 100000 | C
下面是一个非WordPress开发者在黑暗中拍摄的照片...('title',0,3)=>'ASC',substr(strstr('title',' - ',true),3)=>' ASC',substr('title',strpos('title',' - ')+ 1)=>'ASC'“;
细算: https://github.com/woocommerce/woocommerce/blob/master/includes/class-wc-query.php它看起来像排序依据组件只是空格分隔,而不是逗号分隔。试试这个:
$args['orderby'] = "substr('title',0,3) substr(strstr('title','-',true),3) substr('title',strpos('title','-')+1)";
$args['order'] = $order==='DESC'?'DESC':'ASC';
Ok,TKS for回复。但WordPress会动态地从db(MySql)建立它的数组,所以我不知道如何正确地应用这个......而且,我再次不太确定我应该在哪个文件中应用代码(虽然我很确定它是wc查询) –
@MateusOliveira我已经添加了一个应该可靠的mysql方法。这可以为你工作吗? (当然,SELECT子句是无关紧要的/纯粹是为了演示 - 你只需要ORDER BY子句。) – mickmackusa
我真的很抱歉是那个笨蛋,但我是新手,不能将这个应用到我的代码... –
我敢肯定,一个简单的代码告诉WC首先根据找到的标题的长度进行排序,然后根据标题对它进行排序,对我来说就足够了......我'米只是不能写代码下来:( 这是我取得了这么远,但它不工作: '情况下“标题”: 的$ args [“排序依据”] =“mb_strlen(‘标题’)= >'ASC','title'=>'ASC'“; $ args ['order'] = $ order =='DESC'?'DESC':'ASC'; break;' –