PHP
#php#match#bitrix#wordpress#wp-query#php-8

PHP: match для маппинга статуса заказа и режима WP_Query

Использование match (PHP 8.0) для маппинга кодов статуса заказа в стадии сделки и для параметров сортировки запросов WordPress.

Как использовать

  1. Замените длинный switch/if-else на match($variable) { 'value' => result, default => fallback }.
  2. Учитывайте строгое сравнение (===); добавьте default, если не перечислены все варианты.
  3. Используйте для маппинга статусов заказа (Bitrix→CRM), режимов сортировки (WP_Query orderby/order) и подобных справочников.

Маппинг кода статуса заказа в стадию сделки CRM или строки режима («latest», «popular») в параметры WP_Query обычно делают через switch или цепочку if-else. Код получается длинным и легко ошибиться в ветках. В PHP 8.0 появилось выражение match: оно возвращает значение по первой совпавшей ветке и использует строгое сравнение. Проблема: без default при неперечисленном значении PHP выбросит UnhandledMatchError; при путанице с типами (число вместо строки) ветка не сработает. Симптомы: фатал при новом статусе, неверная сортировка в выборке. Ниже — примеры маппинга статуса заказа Bitrix в стадию сделки и режима запроса в аргументы WP_Query; проверка и типичные ошибки по документации match.

Решение

Выражение match для маппинга статусов и режимов без длинных switch. Документация: match, WP_Query orderby.

<?php

// Bitrix: маппинг статуса заказа → стадия сделки CRM
function mapOrderStatusToDealStage(string $statusId): string
{
    return match ($statusId) {
        'N' => 'NEW',
        'P' => 'PREPARATION',
        'F' => 'WON',
        'C' => 'LOSE',
        default => 'NEW',
    };
}

// WordPress: маппинг режима запроса в параметры WP_Query
function getQueryArgsByMode(string $mode): array
{
    return match ($mode) {
        'latest' => ['orderby' => 'date', 'order' => 'DESC'],
        'popular' => ['orderby' => 'comment_count', 'order' => 'DESC'],
        'title'   => ['orderby' => 'title', 'order' => 'ASC'],
        default   => ['orderby' => 'date', 'order' => 'DESC'],
    };
}

Пример использования:

// В обработчике OnSaleOrderSaved или при синхронизации с CRM
$stage = mapOrderStatusToDealStage($order->getField('STATUS_ID'));

// В обёртке над WP_Query
$args = getQueryArgsByMode('popular');
$q = new WP_Query(array_merge(['post_type' => 'post', 'posts_per_page' => 10], $args));

match использует строгое сравнение (===). Блок default обязателен, если не перечислены все возможные значения. Коды статусов заказа (N, P, F, C) и параметры orderby/order — из документации Bitrix и WordPress.

Проверка

  1. Маппинг статуса заказа — вызовите mapOrderStatusToDealStage для каждого кода:
php -r "
require 'vendor/autoload.php'; // или путь к вашим функциям
echo mapOrderStatusToDealStage('N') . PHP_EOL;
echo mapOrderStatusToDealStage('F') . PHP_EOL;
echo mapOrderStatusToDealStage('unknown') . PHP_EOL;
"

Ожидаем: NEW, WON, NEW (для unknown сработает default). Подставьте путь к файлу с функцией или вставьте её в -r.

  1. Режим WP_Query — в среде WordPress вызовите getQueryArgsByMode(‘popular’) и подставьте результат в WP_Query; проверьте, что посты сортируются по comment_count DESC. Для ‘latest’ — по date DESC.

  2. Несуществующее значение без default — если убрать default и передать значение, которого нет в списке веток, PHP выбросит UnhandledMatchError. Всегда добавляйте default для внешних данных (статус заказа, GET-параметр режима).

Типичные ошибки

  • Нет default — при новом статусе или опечатке в режиме match выбросит UnhandledMatchError. Для статусов заказа и пользовательского ввода обязательно указывайте default.
  • Тип не совпадает — match сравнивает через ===. Если статус приходит числом (например 1 вместо ‘N’), ветка не сработает. Приводите к строке до match: match ((string)$statusId) { ... } или проверяйте тип входящих данных.
  • Несколько значений в одну ветку — в match нельзя перечислять через запятую как в switch. Несколько вариантов с одним результатом: 'a', 'b' => 'result' неверно; используйте 'a' => 'result', 'b' => 'result' или вынесите в отдельную функцию/массив.

Где применять

  • Bitrix: синхронизация заказа с CRM (OnSaleOrderSaved), выгрузки, отчёты — маппинг STATUS_ID в стадию/тип в внешней системе.
  • WordPress: обёртки над WP_Query, shortcode-списки постов с параметром sort (latest/popular/title), REST API — маппинг строки режима в orderby/order.
  • PHP 8.0+: любой справочник «код → значение» без побочных эффектов в ветках.

Связанные сниппеты: Изменить статус заказа D7 и сохранить, WP_Query с именованными аргументами, Получить историю оплат и отгрузок заказа.