Установить статус всех товаров "нет в наличии" на основе количества заказов в Woocommerce - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть это конкретное требование в отношении заказов woocommerce. Так что я пытаюсь достичь, как только общее количество заказов в woocommerce достигнет определенного числа (скажем, 200), я больше не хочу принимать заказ и хочу отображать «нет в наличии». «сообщение или любое другое пользовательское сообщение (в основном я не хочу позволять покупателю покупать что-либо, когда это условие становится истинным) для каждого продукта, который у меня есть в моем инвентаре. Я хочу, чтобы эта логика работала и с переменными продуктами.

Мне удалось получить количество заказов, но я застрял сейчас. Это то, что я пробовал до сих пор.

function display_woocommerce_order_count( $atts, $content = null ) {
  $args = shortcode_atts( array(
    'status' => 'processing',
   ), $atts );

  $statuses = array_map( 'trim', explode( ',', $args['status'] ) );
  $order_count = 0;

  foreach ( $statuses as $status ) {
    if ( 0 !== strpos( $status, 'wc-' ) ) {
     $status = 'wc-' . $status;
    }
    $order_count += wp_count_posts( 'shop_order' )->$status;
  }

  echo number_format( $order_count );

  if($order_count == 200){
   //Then make all products go out of stock automatically
   //Not able to figure out this part
  }

}

Пожалуйста, объясните мне, как двигаться дальше.

1 Ответ

0 голосов
/ 04 ноября 2018

Вы не можете сделать это в своем шорткоде напрямую ... Кроме того, ваша функция для подсчета статуса заказов немного сложна. Вместо этого вы можете использовать следующую пользовательскую функцию, которая использует очень легкий SQL-запрос для получения количества заказов.

Другой набор перехваченных функций установит все продукты (даже вариации продуктов переменных продуктов) в состояние «Нет на складе», когда количество заказов достигнет 200.

Наконец, я изменил вашу функцию шорткода, которая будет отображать количество заказов.

Вы можете установить статусы заказов по своему усмотрению, в функции, которая подсчитывает заказы, также в вашем шорткоде.

Вместо этого используйте следующее:

// Utility function to get orders count based on orders statuses 
// Default statuses are processing + completed (and you can change them as you like)
function get_orders_count_from_statuses( $statuses = 'processing, completed' ){
    global $wpdb;

    // Filtering order statuses
    $statuses = "wc-" . str_replace(array("wc-",", ",","), array("",",","','wc-"), $statuses );

    // return the query
    return (int) $wpdb->get_var("SELECT count(ID)  FROM {$wpdb->prefix}posts
    WHERE post_status IN ('$statuses') AND `post_type` LIKE 'shop_order'");
}


// Set conditionally product status based on order count limit
add_filter( 'woocommerce_product_get_stock_status', 'conditional_product_status', 10, 2 );
add_filter( 'woocommerce_product_variation_get_stock_status', 'conditional_product_status', 10, 2 );
function conditional_product_status( $stock_status, $product ){
    if( get_orders_count_from_statuses() >= 200 ){
        $stock_status = 'outofstock';
    }
    return $stock_status;
}


// Your shortcode function that will display the count (if needed)
add_shortcode( 'order_count', 'display_woocommerce_order_count' );
function display_woocommerce_order_count( $atts ) {
    $atts = shortcode_atts( array(
        'statuses' => 'processing,completed',
    ), $atts, 'order_count' );

    $order_count = get_orders_count_from_statuses( $atts['statuses'] );

    return number_format( $order_count ); // Always use return (not echo for a shortcode)
}

Код помещается в файл function.php вашей активной дочерней темы (active theme). Проверено и работает.

...