当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); 
} 
+0

我敢肯定,一个简单的代码告诉WC首先根据找到的标题的长度进行排序,然后根据标题对它进行排序,对我来说就足够了......我'米只是不能写代码下来:( 这是我取得了这么远,但它不工作: '情况下“标题”: 的$ args [“排序依据”] =“mb_strlen(‘标题’)= >'ASC','title'=>'ASC'“; $ args ['order'] = $ order =='DESC'?'DESC':'ASC'; break;' –

在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'“;

Demo

细算: 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'; 
+0

Ok,TKS for回复。但WordPress会动态地从db(MySql)建立它的数组,所以我不知道如何正确地应用这个......而且,我再次不太确定我应该在哪个文件中应用代码(虽然我很确定它是wc查询) –

+0

@MateusOliveira我已经添加了一个应该可靠的mysql方法。这可以为你工作吗? (当然,SELECT子句是无关紧要的/纯粹是为了演示 - 你只需要ORDER BY子句。) – mickmackusa

+0

我真的很抱歉是那个笨蛋,但我是新手,不能将这个应用到我的代码... –