php — Jak zbiorczo zmienić kody SKU produktów za pomocą wtyczki
Hej, mam sklep Woo, w którym prawie wszystkie moje kody SKU są błędne. Próbuję utworzyć wtyczkę, aby zbiorczo aktualizować wszystkie jednostki SKU, ale nie działa ona tak, jak powinna. Oto fragment kodu:
<?php
if (!defined('ABSPATH')) {
exit; // Exit if accessed directly.
}
/**
* Add a submenu page under WooCommerce menu
*/
function custom_sku_update_menu() {
add_submenu_page(
'woocommerce',
'Update Product SKUs',
'Update SKUs',
'manage_options',
'custom-sku-update',
'custom_sku_update_page'
);
}
add_action('admin_menu', 'custom_sku_update_menu');
/**
* Callback function for the submenu page
*/
function custom_sku_update_page() {
?>
<div class="wrap">
<h1>Update Product SKUs</h1>
<form method="post">
<p><strong>Note:</strong> This will update product SKUs in bulk based on preset criteria.</p>
<p>Example 1: If SKU is 1234, it will become 000001234</p>
<p>Example 2: If SKU is 11-345, it will become 110000345</p>
<p>Example 3: If SKU is 12345, it will become 000012345</p>
<input type="submit" name="update_skus" class="button button-primary" value="Update SKUs">
</form>
</div>
<?php
}
/**
* Function to update product SKUs based on preset criteria
*/
function update_product_skus() {
// Get all products
$args = array(
'post_type' => 'product',
'posts_per_page' => -1,
);
$products = new WP_Query($args);
if ($products->have_posts()) {
while ($products->have_posts()) {
$products->the_post();
$product_id = get_the_ID();
$product = wc_get_product($product_id);
// Get current SKU
$sku = $product->get_sku();
// Update SKU based on criteria
$new_sku = $sku;
// Example 1: If SKU is 1234, it will become 000001234
if (preg_match('/^\d{4}$/', $sku)) {
$new_sku = sprintf('%010d', $sku);
}
// Example 2: If SKU is 11-345, it will become 110000345
if (preg_match('/^(\d+)-(\d+)$/', $sku, $matches)) {
$new_sku = $matches[1] . sprintf('%04d', $matches[2]);
}
// Example 3: If SKU is 12345, it will become 000012345
if (preg_match('/^\d{5}$/', $sku)) {
$new_sku = sprintf('%09d', $sku);
}
// Only update SKU if it has changed
if ($new_sku !== $sku) {
// Update SKU
$product->set_sku($new_sku);
$product->save();
}
}
}
wp_reset_postdata();
}
/**
* Hook to run the SKU update when the form is submitted
*/
add_action('admin_init', 'custom_sku_update_process');
function custom_sku_update_process() {
if (isset($_POST['update_skus'])) {
update_product_skus();
echo '<div class="updated"><p>Product SKUs updated successfully!</p></div>';
}
}
Problem polega na tym, że w zależności od przypadku nie dodaje poprawnych zer. Na przykład dodaje 3 zera zamiast 4 w przykładzie 2. Lub w przykładzie 1 dodaje 4 zera z przodu zamiast 5 zer. Czy ktoś może mi pomóc, czy to coś z moimi wyrażeniami regularnymi?