פונקציה לעדכון כל המחירים בחנות WooCommerce בלחיצת כפתור

שיתוף:

מחפשים דרך להעלות או להוריד את כל המחירים של כל המוצרים ב-X אחוז?

נכון, אפשר לעבור אחד אחד, לפתוח מחשבון ולעדכן, אבל מה אם יש לכם מאות מוצרים ואולי אלפים? אפשר לייצא לאקסל, להריץ פונקציה ולייבא, אבל זה איכשהו תמיד מסתבך!

מה אם אגיד לכם שאפשר לזרוק כמה שורות בקובץ functions, להתאים לצרכים שלכם וכך תקבלו אפשרות לעדכן הכל בלחיצת כפתור?

תיאור הפונקציה

  • הפונקציה מוסיפה כפתורים לעמוד ניהול המוצרים בוורדפרס. הכפתורים מאפשרים להעלות או להוריד את המחירים באחוז מוגדר בצורה אחידה לכל המוצרים באתר, כולל וריאציות של מוצרים.
  • לאחר לחיצה על על הכפתורים, יתחיל תהליך עידכון מחירים מאחורי הקלעים, זה יכול לקחת כמה שניות או כמה גג דקות אם יש אלפי מוצרים. חשוב לא לסגור את החלון באמצע העדכון!
  • המחירים + מחירי הוריאציות של כל המוצרים עולים/יורדים ב-5% ומתעגלים ל-10 הקרוב ביותר, כלומר 20, 160,  580 וכו’
    **גם את המספרים אפשר לשנות בקלות רבה!
  • העדכון יופיע מיד במערכת הניהול ובאתר
  • אם יש צורך – אפשר גם לערוך מוצרים מסויימים ידנית, שלא דרך הכפתורים שהוספנו.
  • זה הכל!

⚠️למרות שהפונקציה נבדקה בכמה וכמה אתרים, ממליץ לכם לדאוג ולוודא שיש גיבוי זמין למקרה שמשהו ישתבש!!!⚠️

הקוד

את הקוד הזה שמים בקובץ functions.php בתבנית הבת, מי שלא סגור מה זה אומר, אפשר לקרוא את המדריך בנושא תבנית בת.

//Update prices buttons by Saglix
function saglix_update_products_prices_buttons() {
    $current_screen = get_current_screen();
    if ('edit-product' === $current_screen->id) {
        ?>
        <script type="text/javascript">
            jQuery(document).ready(function($) {
                const buttons = [
                    { id: 'increase_prices', label: 'Increase Prices', alert: 'Prices increased' },
                    { id: 'decrease_prices', label: 'Decrease Prices', alert: 'Prices decreased' }
                ];

                buttons.forEach(button => {
                    $(".wrap .page-title-action:last").after(`<button id="${button.id}" class="custom-price-button page-title-action">${button.label}</button>`);

                    $(`#${button.id}`).click(function() {
                        const mode = button.id === 'increase_prices' ? 'increase' : 'decrease';
                        const $btn = $(this);

                        $(".custom-price-button").prop('disabled', true).text('Updating prices ⏳');

                        $.post(ajaxurl, { action: 'update_wc_product_prices', mode: mode }, function(response) {
                            alert(button.alert);

                            $(".custom-price-button").prop('disabled', false).each(function(index, elem) {
                                $(elem).text(buttons[index].label);
                            });
                        });
                    });
                });
            });
        </script>
        <?php
    }
}
add_action('admin_footer', 'saglix_update_products_prices_buttons');

add_action('wp_ajax_update_wc_product_prices', 'handle_update_wc_product_prices');

function handle_update_wc_product_prices() {
    $round_factor = -1;
    $percentage_change = 0.05;

    $mode = $_POST['mode'];
    $multiplier = $mode === 'increase' ? (1 + $percentage_change) : (1 - $percentage_change);

    $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 = wc_get_product(get_the_ID());

        if ($product->is_type('variable')) {
            foreach ($product->get_children() as $variation_id) {
                $variation = wc_get_product($variation_id);
                $regular_price = (float) $variation->get_regular_price();
                $sale_price = (float) $variation->get_sale_price();
                $variation->set_regular_price(round($regular_price * $multiplier, $round_factor));
                if ($sale_price) {
                    $variation->set_sale_price(round($sale_price * $multiplier, $round_factor));
                }
                $variation->save();
            }
        } else {
            $regular_price = (float) $product->get_regular_price();
            $sale_price = (float) $product->get_sale_price();
            $product->set_regular_price(round($regular_price * $multiplier, $round_factor));
            if ($sale_price) {
                $product->set_sale_price(round($sale_price * $multiplier, $round_factor));
            }
            $product->save();
        }
    endwhile; endif;
    wp_reset_postdata();

    wp_send_json_success();
}

 

התאמות

אז הדוגמה שנתנו תעבוד במקרה של העלאה/הורדה של המחירים ב-5% ועיגול כלפי ה-10 הקרוב ביותר.

צריכים לשנות את האחוז או את העיגול?

יש לשנות בשורה של round_factor את המספר בהתאם לצורך:

  • -1 : ל-10 הקרוב ביותר (לדוג’ 230)
  • -2 : ל-100 הקרוב ביותר (לדוג’ 200)
  • 0 : ל-1 הקרוב ביותר (לדוג’ 233)
  • 1 : ל-0.1 הקרוב ביותר (לדוג’ 233.4)
  • 2 : ל-0.01 הקרוב ביותר (לדוג’ 233.35)

ובשורה של percentage_change ואת האחוזים בהתאם לצורך:

  • 0.05 : העלאה/הורדה של 5%
  • 0.01 : העלאה/הורדה של 1%
  • 0.1 : העלאה/הורדה של 10%

בהצלחה אלופים!

סיכום

תרגישו חופשי להשתמש בפונקציה, לשלוח לחברים וקולגות, ולעשות משהו טוב עם כל הזמן שהתפנה לכם 🙂

מה חשבת על המאמר? אשמח לשמוע :)

[likebtn theme="custom" btn_size="42" f_size="16" icon_size="20" icon_l_c="#ffffff" icon_l_c_v="#055cff" icon_d_c="#ffffff" icon_d_c_v="#fc3c3c" label_c="#ffffff" bg_c="rgba(122,122,122,0.52)" i18n_like="אהבתי" i18n_dislike="פחות" ef_voting="push" alignment="center"]

אולי תאהב/י גם: