WordPress

php — Jak zbiorczo zmienić kody SKU produktów za pomocą wtyczki

  • 4 marca, 2024
  • 3 min read
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?

Warto przeczytać!  Wyświetl miniaturę kanału RSS WordPress


Źródło