You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenCart自动生成商品排序号:将倒序改为正序1至N

问题描述

我不是开发人员,麻烦耐心解答。我在GitHub上找了一款已停止维护的OCMOD代码,正在OpenCart 3.0.3.6和3.0.3.8测试环境中测试。当前XML文件会给数据库里排序号(sort_order)为0的商品自动生成排序号,规则是从5000倒序生成(4999…1…-50000及更小值)。我需要把它改成从1到N的正序生成规则。

原OCMOD代码如下:

<file path="admin/controller/catalog/product.php">
        <operation>
            <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search>
            <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) {
                $data['sort_order'] = ( 5000 - $this->request->get['product_id'] );]]></add>
        </operation>
    <!-- Automatic Product Sort Number -->
            <operation>
                <search><![CDATA[ $data['sort_order'] = 1; ]]></search>
                <add position=" replace"><![CDATA[ $data['sort_order'] = 0;]]></add>
            </operation>
        </file>
修改方案

要实现从1开始的正序排序号生成,只需要修改原OCMOD代码里的两个关键部分:

1. 替换倒序生成逻辑

原代码里的5000 - $this->request->get['product_id']是倒序生成的核心,直接改成正序逻辑即可:

  • 如果你的商品ID是从1开始递增的,直接用商品ID作为排序号,修改后的代码段:
    <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) {
        $data['sort_order'] = $this->request->get['product_id'];]]></add>
    
  • 如果需要严格从1开始连续递增(不管商品ID是否连续),需要先查询当前数据库里最大的排序号,再加1。这时候要同时修改控制器和模型:
    控制器里的代码段改成:
    <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) {
        $this->load->model('catalog/product');
        $max_sort_order = $this->model_catalog_product->getMaxSortOrder();
        $data['sort_order'] = $max_sort_order + 1;]]></add>
    
    然后给商品模型添加一个获取最大排序号的方法,在OCMOD里加这段代码:
    <file path="admin/model/catalog/product.php">
        <operation>
            <search><![CDATA[ public function getProducts($data = array()) { ]]></search>
            <add position="before"><![CDATA[ public function getMaxSortOrder() {
                $query = $this->db->query("SELECT MAX(sort_order) as max_sort FROM " . DB_PREFIX . "product");
                return $query->row['max_sort'] ? $query->row['max_sort'] : 0;
            }]]></add>
        </operation>
    </file>
    

2. 还原初始排序号(可选)

原代码把新商品默认排序号从1改成了0,如果你希望新添加商品时默认从1开始,把对应的operation改回原来的设置:

<operation>
    <search><![CDATA[ $data['sort_order'] = 1; ]]></search>
    <add position="replace"><![CDATA[ $data['sort_order'] = 1;]]></add>
</operation>

或者直接删掉这个operation,保留系统默认的初始值。

最终完整OCMOD代码

方案一:用商品ID作为正序排序号

<file path="admin/controller/catalog/product.php">
    <operation>
        <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search>
        <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) {
            $data['sort_order'] = $this->request->get['product_id'];]]></add>
    </operation>
    <!-- 不需要默认设为0的话,可以删掉下面这段 -->
    <!-- <operation>
        <search><![CDATA[ $data['sort_order'] = 1; ]]></search>
        <add position="replace"><![CDATA[ $data['sort_order'] = 0;]]></add>
    </operation> -->
</file>

方案二:严格连续递增排序号

<file path="admin/controller/catalog/product.php">
    <operation>
        <search><![CDATA[ $data['sort_order'] = $this->request->post['sort_order']; ]]></search>
        <add position="after"><![CDATA[ } elseif ((!empty($product_info)) && ($product_info['sort_order'] == 0)) {
            $this->load->model('catalog/product');
            $max_sort_order = $this->model_catalog_product->getMaxSortOrder();
            $data['sort_order'] = $max_sort_order + 1;]]></add>
    </operation>
    <!-- 可选:还原新商品默认排序号为1 -->
    <operation>
        <search><![CDATA[ $data['sort_order'] = 1; ]]></search>
        <add position="replace"><![CDATA[ $data['sort_order'] = 1;]]></add>
    </operation>
</file>

<file path="admin/model/catalog/product.php">
    <operation>
        <search><![CDATA[ public function getProducts($data = array()) { ]]></search>
        <add position="before"><![CDATA[ public function getMaxSortOrder() {
            $query = $this->db->query("SELECT MAX(sort_order) as max_sort FROM " . DB_PREFIX . "product");
            return $query->row['max_sort'] ? $query->row['max_sort'] : 0;
        }]]></add>
    </operation>
</file>

内容的提问来源于stack exchange,提问作者carloslozada

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:57:08