Php 商业中标题由字母和数字组成时的自定义分类产品

Php 商业中标题由字母和数字组成时的自定义分类产品,php,mysql,wordpress,sorting,woocommerce,Php,Mysql,Wordpress,Sorting,Woocommerce,所以,我做了一些挖掘,但没有找到正确的方法 我在WooCommerce Wordpress上有一些产品,但它们的标题是由字母和数字混合而成的。 我需要这些产品像这样打印,例如: FNC2100-C FNC2450-C FNC23250-C 当然,Wordpress给了我: FNC2100-C FNC23250-C FNC2450-C 有没有办法做到这一点 我想我可以在WP_查询上做些什么,但我是一个真正的PHP新手,我知道有些可能的修复是在PHP上,有些是在MySQL上。。。而事实上,标题是字符

所以,我做了一些挖掘,但没有找到正确的方法

我在WooCommerce Wordpress上有一些产品,但它们的标题是由字母和数字混合而成的。 我需要这些产品像这样打印,例如:

FNC2100-C FNC2450-C FNC23250-C

当然,Wordpress给了我:

FNC2100-C FNC23250-C FNC2450-C

有没有办法做到这一点

我想我可以在WP_查询上做些什么,但我是一个真正的PHP新手,我知道有些可能的修复是在PHP上,有些是在MySQL上。。。而事实上,标题是字符串和整数,让我觉得不知道如何写这个

有人有什么建议吗

下面是class-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中,只需调用

代码:

输出:

array (
  3 => 'FMC30000-C',
  4 => 'FNC21000-C',
  1 => 'FNC24500-C',
  2 => 'FNC232500-C',
  0 => 'FND100000-C',
)
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
在MYSQL中,只要格式是

3封信 然后是一系列的数字 连字符 一个或多个字符 …您可以通过拨打电话和

表和查询:

输出:

array (
  3 => 'FMC30000-C',
  4 => 'FNC21000-C',
  1 => 'FNC24500-C',
  2 => 'FNC232500-C',
  0 => 'FND100000-C',
)
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开发者在黑暗中拍摄的照片

$args['orderby']=substr'title',0,3=>'ASC',substrstrstrstrstrstr'title','-',true,3=>'ASC',substr'title',strps'title','-'+1=>'ASC'

在看了以下内容后: 看起来orderby组件只是以空格分隔,而不是以逗号分隔。试试这个:

$args['orderby'] = "substr('title',0,3) substr(strstr('title','-',true),3) substr('title',strpos('title','-')+1)";
$args['order'] = $order==='DESC'?'DESC':'ASC';

好的,谢谢你的回复。但是WordPress将从DBMySQL动态构建它的数组,所以我不确定如何正确地应用它。。。同样,我也不确定应该在哪个文件中应用代码,尽管我很确定它是wc-query@MateusOliveira我添加了一个应该可靠的mysql方法。这对你有用吗?当然,SELECT子句与演示无关/仅用于演示-您只需要ORDER BY子句。我真的很抱歉这么愚蠢,但我是个新手,无法将其应用到我的代码中…嗯,我不是Wordpress开发人员。我可以带你去喝水,但我不能强迫你喝水。祝你好运。Wordpress直接从db构建它的数组,db已经注册了所有的产品。不幸的是,我没有访问数据库的权限。。。所以我将无法在MySQL上执行任何操作。。。我知道我可以请求db值,在数组中组织它们,然后使用natsort进行排序,但我不确定如何获取它。我将在这个问题上粘贴WooCommerce class-wc-query.php代码,我相信这是我必须解决的问题。我非常确定,一个简单的代码告诉wc首先根据找到的标题的长度排序,然后根据标题排序,对我来说就足够了。。。我只是不能把代码写下来:这是我到目前为止取得的成绩,但它不起作用:case'title':$args['orderby']=mb_strlen'title'=>'ASC','title'=>'ASC'$args['order']=$order=='DESC'?'DESC':'ASC';打破