/** * Tự động tạo keywords cho sản phẩm WooCommerce – chạy trực tiếp từ functions.php * Thêm vào cuối file functions.php của theme (hoặc một file plugin tạm thời) * Truy cập: https://lethuongco.com.vn/wp-admin/?lt_generate_keywords=1 * Yêu cầu: WooCommerce đã kích hoạt */ add_action( 'init', 'lt_auto_generate_keywords_run' ); function lt_auto_generate_keywords_run() { // Chỉ chạy khi có tham số đặc biệt if ( ! isset( $_GET['lt_generate_keywords'] ) || $_GET['lt_generate_keywords'] !== '1' ) { return; } // Chỉ admin mới được chạy if ( ! current_user_can( 'manage_options' ) ) { wp_die( 'Bạn không có quyền thực hiện tác vụ này.' ); } // Kiểm tra WooCommerce đã kích hoạt chưa if ( ! class_exists( 'WooCommerce' ) ) { wp_die( 'WooCommerce chưa được kích hoạt.' ); } // Tăng thời gian chạy tối đa để tránh timeout (nếu host cho phép) set_time_limit( 0 ); ignore_user_abort( true ); // Bắt đầu xử lý echo '
Hoàn tất! Keywords đã được tạo và gán cho sản phẩm.
'; echo ''; exit; } /** * Xử lý tất cả sản phẩm (dùng phân trang để tránh quá tải bộ nhớ) */ function lt_process_all_products() { $batch_size = 50; // Số sản phẩm mỗi lần lấy $page = 1; $total_processed = 0; do { $products = wc_get_products( array( 'status' => 'publish', 'type' => 'simple', // Có thể thêm 'variable' nếu muốn 'limit' => $batch_size, 'page' => $page, 'return' => 'objects', ) ); if ( empty( $products ) ) { break; } foreach ( $products as $product ) { lt_process_single_product( $product ); $total_processed++; } echo "Đã xử lý {$total_processed} sản phẩm...
"; flush(); $page++; } while ( count( $products ) === $batch_size ); echo "Tổng số sản phẩm đã xử lý: {$total_processed}
"; } /** * Xử lý một sản phẩm: tạo keywords và cập nhật tags */ function lt_process_single_product( $product ) { $title = $product->get_name(); $sku = $product->get_sku(); // Tạo keywords mới $new_keywords = lt_generate_keywords( $title, $sku ); // Lấy tags hiện tại $existing_tags = wp_get_object_terms( $product->get_id(), 'product_tag', array( 'fields' => 'names' ) ); if ( is_wp_error( $existing_tags ) ) { $existing_tags = array(); } // Gộp, loại trùng, giới hạn 20 tags $all_keywords = array_unique( array_merge( $existing_tags, $new_keywords ) ); $all_keywords = array_slice( $all_keywords, 0, 20 ); if ( ! empty( $all_keywords ) ) { wp_set_object_terms( $product->get_id(), $all_keywords, 'product_tag', false ); } } /** * Sinh keywords từ title và sku (logic giống plugin cũ) */ function lt_generate_keywords( $title, $sku ) { $keywords = array(); $stop_words = array( 'a', 'an', 'and', 'are', 'as', 'at', 'be', 'but', 'by', 'for', 'if', 'in', 'into', 'is', 'it', 'no', 'not', 'of', 'on', 'or', 'such', 'that', 'the', 'their', 'then', 'there', 'these', 'they', 'this', 'to', 'was', 'will', 'with', 'của', 'và', 'có', 'được', 'các', 'những', 'để', 'cho', 'khi', 'về', 'là', 'này', 'một', 'trên', 'cũng', 'ở', 'từ', ); $title_lower = mb_strtolower( trim( $title ) ); if ( ! empty( $title_lower ) ) { $keywords[] = $title_lower; } if ( ! empty( $sku ) ) { $keywords[] = $title_lower . ' ' . mb_strtolower( trim( $sku ) ); } $words = preg_split( '/\s+/', $title_lower, -1, PREG_SPLIT_NO_EMPTY ); if ( count( $words ) >= 2 ) { for ( $n = 2; $n <= 5; $n++ ) { for ( $i = 0; $i <= count( $words ) - $n; $i++ ) { $phrase = array_slice( $words, $i, $n ); $keywords[] = implode( ' ', $phrase ); } } } // Lọc bỏ stop words và trùng lặp $filtered = array(); foreach ( $keywords as $kw ) { $kw = trim( $kw ); if ( empty( $kw ) ) { continue; } $words = explode( ' ', $kw ); $words = array_diff( $words, $stop_words ); if ( ! empty( $words ) ) { $filtered[] = implode( ' ', $words ); } } return array_unique( $filtered ); }