使用Golang检查woocommence产品图库是否超过大小

可以批量跑出存在大于某个大小产品图库的所有产品ID,也可以调整下输出,处理图片或者再写个压缩的函数进行压缩。实际测试跑5000多个产品,21秒钟跑完了,速度很快。

代码:

package main

import (
	"database/sql"
	"flag"
	"fmt"
	"log"
	"os"
	"strings"
	"time"
	_ "github.com/go-sql-driver/mysql"
)

type Product struct {
	ID                int
	Title             string
	FeaturedImage     string
	ProductImageGallery sql.NullString
}

var (
	dbName   string
	dbUser   string
	dbPass   string
	dbURL    string
	filePath string
	website  string
)

func init() {
	flag.StringVar(&dbName, "dbname", "", "MySQL数据库名")
	flag.StringVar(&dbUser, "dbuser", "", "MySQL数据库用户")
	flag.StringVar(&dbPass, "dbpass", "", "MySQL数据库密码")
	flag.StringVar(&dbURL, "dburl", "", "MySQL数据库URL")
	flag.StringVar(&filePath, "filepath", "", "用于替换GUID的文件路径前缀")
	flag.StringVar(&website, "website", "", "要在GUID中替换的网站URL前缀")
	flag.Parse()

	if dbName == "" || dbUser == "" || dbPass == "" || dbURL == "" || filePath == "" || website == "" {
		log.Fatal("请提供所有必需的命令行参数")
	}
}

func main() {
    // 用法,可以编译后使用,例子:go run main.go -dbname=数据库名 -dbuser=数据库账户 -dbpass=数据库密码 -dburl=数据库地址 -filepath=站点路径 -website=站点域名
    // 例子:go run main.go -dbname=数据库名 -dbuser=数据库账户 -dbpass=数据库密码 -dburl=数据库地址 -filepath=/www/wwwroot/kekc.cn -website=https://www.kekc.cn
    
    // 执行步骤
    // 1、获取所有产品(ID)
    // 2、根据获取的产品ID获取产品图库
    // 3、获取图片的网址,替换成路径
    // 4、判断图片大小,大于300KB则将product.ID存入当前目录下的list.txt文件中
    // 最后再去重之类的处理,得到所有存在大于300KB的产品。
    
	startTime := time.Now()

	// 构建数据库连接字符串
	dbConnectionString := fmt.Sprintf("%s:%s@tcp(%s)/%s", dbUser, dbPass, dbURL, dbName)

	// 替换为你的数据库连接信息
	db, err := sql.Open("mysql", dbConnectionString)
	if err != nil {
		log.Fatal(err)
	}
	defer db.Close()

	// 查询产品的基本信息以及 _product_image_gallery 和 _wp_attached_file
	rows, err := db.Query(`
		SELECT p.ID, p.post_title, p.guid, m.meta_value
		FROM wp_posts p
		LEFT JOIN wp_postmeta m ON p.ID = m.post_id AND m.meta_key = '_product_image_gallery'
		WHERE p.post_type = 'product'
	`)
	if err != nil {
		log.Fatal(err)
	}
	defer rows.Close()

	var products []Product

	for rows.Next() {
		var product Product
		err := rows.Scan(&product.ID, &product.Title, &product.FeaturedImage, &product.ProductImageGallery)
		if err != nil {
			log.Fatal(err)
		}

		products = append(products, product)
	}

	if err := rows.Err(); err != nil {
		log.Fatal(err)
	}

	// 检查是否有list.txt文件,没有则创建
	_, err = os.Stat("list.txt")
	if os.IsNotExist(err) {
		file, err := os.Create("list.txt")
		if err != nil {
			log.Fatal(err)
		}
		defer file.Close()
	}

	for _, product := range products {
		fmt.Printf("产品ID:%d\n", product.ID)
		fmt.Printf("产品标题:%s\n", product.Title)
		fmt.Printf("特色图片URL:%s\n", product.FeaturedImage)

		// 如果 ProductImageGallery 有效,则拆分并遍历
		if product.ProductImageGallery.Valid {
			imageIDs := strings.Split(product.ProductImageGallery.String, ",")

			// 遍历每个图像的 ID,并获取 GUID
			for _, imageID := range imageIDs {
				guid, err := getImageGuid(db, imageID)
				if err != nil {
					log.Println(err)
					continue
				}

				// 替换GUID中的字符串
				replacedGuid := strings.Replace(guid, website, filePath, -1)

				// 获取文件大小
				size, err := getFileSize(replacedGuid)
				if err != nil {
					log.Println(err)
					continue
				}

				fmt.Printf("图像ID:%s,修改后的GUID:%s,大小:%d 字节\n", imageID, replacedGuid, size)

				// 判断文件大小是否大于300KB,如果是,则将product.ID追加到list.txt里
				if size > 300*1024 {
					err := appendToList("list.txt", fmt.Sprintf("%d\n", product.ID))
					if err != nil {
						log.Println(err)
					}
				}
			}
		} else {
			fmt.Println("产品图像库为空")
		}

		fmt.Println("------------------------")
	}

	elapsedTime := time.Since(startTime)
	fmt.Printf("总执行时间:%s\n", elapsedTime)
}

func getImageGuid(db *sql.DB, imageID string) (string, error) {
	var guid string
	err := db.QueryRow("SELECT guid FROM wp_posts WHERE ID = ?", imageID).Scan(&guid)
	if err != nil {
		if err == sql.ErrNoRows {
			return "", fmt.Errorf("找不到图像ID:%s的行", imageID)
		}
		return "", err
	}
	return guid, nil
}

func getFileSize(filePath string) (int64, error) {
	fileInfo, err := os.Stat(filePath)
	if err != nil {
		return 0, err
	}
	return fileInfo.Size(), nil
}

func appendToList(fileName, content string) error {
	file, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		return err
	}
	defer file.Close()

	if _, err := file.WriteString(content); err != nil {
		return err
	}

	return nil
}
© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称常用语 夸夸
夸夸
还有吗!没看够!
表情代码图片

    暂无评论内容