PHP: match для маппинга статуса заказа и режима WP_Query
Использование match (PHP 8.0) для маппинга кодов статуса заказа в стадии сделки и для параметров сортировки запросов WordPress.
Как использовать
- Замените длинный switch/if-else на match($variable) { 'value' => result, default => fallback }.
- Учитывайте строгое сравнение (===); добавьте default, если не перечислены все варианты.
- Используйте для маппинга статусов заказа (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.
Проверка
- Маппинг статуса заказа — вызовите 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.
-
Режим WP_Query — в среде WordPress вызовите getQueryArgsByMode(‘popular’) и подставьте результат в WP_Query; проверьте, что посты сортируются по comment_count DESC. Для ‘latest’ — по date DESC.
-
Несуществующее значение без 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 с именованными аргументами, Получить историю оплат и отгрузок заказа.