Skip to content

StockMultiStore

Anatoly Yumashev edited this page Nov 3, 2020 · 1 revision

Учет остатков с учетом множества складов

Решение позволяет указать список складов, по которым мы показываем или скрываем товары в магазине.

Задача и обсуждение тут https://github.com/wpcraft-ru/wooms/issues/362

Код и инструкция

Простейший вариант установки:

  • создаем файлик типа wp-content/mu-plugins/StockFilterByStores.php
  • кидаем туда код и меняем список складов в 1 переменной класса
  • оно будет сразу работать

либо можно создать файлик в папке wp-content/plugins/StockFilterByStores.php - в этом случае плагин можно включать и отключать

<?php
/*
Plugin Name: WooMS Stock Multi Store
Plugin URI: https://github.com/wpcraft-ru/wooms/issues/362
Description: Обеспечивает синк по множеству складов. Список складов правится в коде. 
Version: 1
Author: wpcraft.ru
Author URI: https://wpcraft.ru
*/

/**
 * Filter by some stores
 */
class StockFilterByStores
{

    /**
     * 1. тут пишем список складов через запятую
     * 2. опцию в настройках сайта - отключаем
     */
    public static $include_stores = "Основной склад, Розничный склад";

    public static function init()
    {

        // tests
        // add_action('init', function () {
        //     if (!isset($_GET['dd'])) {
        //         return;
        //     }

        //     echo '<pre>';

        //     $check = self::filters_by_store([]);

        //     var_dump($check);

        //     die(0);
        // });


        add_filter('wooms_assortment_sync_filters', [__CLASS__, 'filters_by_store']);
    }

    /**
     * use $filters = apply_filters('wooms_assortment_sync_filters', $filters);
     */
    public static function filters_by_store($filters)
    {
        if($additional_store_hrefs = self::get_additional_stores()){
            foreach($additional_store_hrefs as $store_href){
                $filters[] = 'stockStore=' . $store_href;
            }
        }

        return $filters;
    }

    public static function get_additional_stores()
    {

        if(!$stores_api = get_transient('wooms_stores')){
            $stores_api = wooms_request('https://online.moysklad.ru/api/remap/1.2/entity/store/');

            set_transient('wooms_stores', $stores_api, MINUTE_IN_SECONDS * 5);
        }

        $include_stores = array_map('trim', explode(",", self::$include_stores));

        if(empty($stores_api['rows'])){
            return false;
        }

        $stores_href_list = [];
        foreach($stores_api['rows'] as $row){
            if(in_array($row['name'], $include_stores)){
                $stores_href_list[] = $row['meta']['href'];
            }
        }

        if(empty($stores_href_list)){
            return false;
        }

        return $stores_href_list;

    }
}

StockFilterByStores::init();