WordPress мета-запрос с мета сериализованным массивом данных

Вопрос или проблема

Ищите метод вложения отношения AND/OR в meta_query на основе сериализованных значений массива.

Уже рассмотрел следующие:
Запрос нескольких значений мета-ключей?
WP Meta Query для некоторых мета (массив) значений

Я понимаю, что сериализованные данные ‘не должны’ использоваться для поиска/фильтрации (или их сначала нужно извлечь для этого за пределами SQL), НО я хотел бы предложить это, чтобы увидеть, сможет ли вложение решить проблему.

Например. Данные [ meta_value поле1 = ‘abc’ , meta_value поле2 a:2:{i:0;s:1:”1″;i:1;s:1:”4″;} ]

Это содержит значения [ “1”, “4”] как строковый массив.

Поиск, который я хотел бы выполнить, выглядит как

$metaSearchQuery = [
            'relation'    => 'AND',
            [
               'key' => '<FIELDNAME1>',
                'value' => 'abc'
            ],
            [
            'relation'    => 'OR',
               [
                  'key'          => '<FIELDNAME2>',
                  'value'        => serialize(strval(1)),
                  'compare'      => 'like',
               ],
               [
                  'key'          => '<FIELDNAME2>',
                  'value'        => serialize(strval(4)),
                  'compare'      => 'like',
               ],
               ...............
            ]
        ];

С выходным SQL что-то вроде

... where meta_value.field1 = 'abc' and (field2 like 's:1:"1"' or field2 like 's:1:"4"')

Таким образом, вы могли бы использовать основное условие ‘AND’ для других полей и вложить ‘OR’ для значений массива…? Это вообще возможно с использованием meta_query?

Причина в том, что мне действительно нужно фильтровать, и значения могут быть 1, 2, 3, 4 или любая комбинация из них. Таксономия лучше, да, но это уже было написано, поэтому я хотел бы использовать структуру мета, если это возможно.

Наверное, стоило подождать немного, но после размещения вопроса я нашел решение на основе моих вышеуказанных пунктов и повторяю его здесь:

https://codex.wordpress.org/Class_Reference/WP_Meta_Query

https://generatewp.com/filtering-data-with-wp_meta_query/

Мое решение:

$metaSearchSubQuery = [
            'relation' => 'OR'    
        ];

foreach($eventTypeId as $id) {
    $metaSearchSubQuery[] = [
        'key'          => 'EventId',
        'value'        => serialize($id),
        'compare'      => 'like'
    ];
}

$metaSearchQuery[] = $metaSearchSubQuery;

Ответ или решение

Использование WP_Meta_Query для поиска по сериализованным данным в WordPress

Если вы работаете с WordPress и настраиваете сложные запросы к базе данных, вам может понадобиться использовать возможности WP_Meta_Query для фильтрации постов на основе сериализованных данных. Несмотря на то, что сериализованные данные и хранение массивов в одном поле могут усложнять запроса, возможно создать вложенные условия AND/OR, что делает это решение достаточно гибким.

Введение в проблему

В вашем случае вы хотите выполнить запрос, который включает поиск по нескольким значениям, сохранённым в сериализованном виде. Вы уже определили некоторые ключевые моменты и нашли решение на основе WP_Meta_Query, что является хорошим стартом. Давайте рассмотрим ваш пример более детально.

Сериализация в WordPress

Сериализация данных в WordPress часто приводит к проблемам производительности и сложности, однако иногда это неизбежно. Данные могут выглядеть примерно так:

a:2:{i:0;s:1:"1";i:1;s:1:"4";}

Это означает массив, содержащий строки "1" и "4". Если вы хотите искать по этим значениям, полезно использовать функцию serialize() для составления ваших meta_query.

Пример запроса

Чтобы выполнить запрос, который эффективно находил бы посты с определёнными значениями метаполей, можно использовать следующий подход:

// Данные для поиска
$eventTypeId = [1, 4]; // Можете добавлять любые другие значения

// Основной запрос
$metaSearchQuery = [
    'relation' => 'AND',
    [
        'key' => '<FIELDNAME1>',
        'value' => 'abc',
    ],
    [
        'relation' => 'OR',
    ]
];

// Формирование вложенного подзапроса
foreach ($eventTypeId as $id) {
    $metaSearchQuery[1][] = [
        'key' => '<FIELDNAME2>',
        'value' => serialize($id),
        'compare' => 'LIKE',
    ];
}

// Выполните запрос
$query = new WP_Query([
    'meta_query' => $metaSearchQuery,
]);

Объяснение кода

  1. Основной массив $metaSearchQuery: Вы начинаете с массива, который определяет основные условия поиска. В вашем случае, вводится условие, где <FIELDNAME1> равно ‘abc’.

  2. Вложенный массив для подзапроса: Используется ключ ‘relation’ с типом ‘OR’, чтобы объединить условия для поиска сериализованных значений. Это позволяет находить записи, где значение <FIELDNAME2> совпадает с сериализованным значением для каждого id.

  3. Функция WP_Query: Используйте объект WP_Query для выполнения запроса к базе данных на основе созданного вами массив мета-запросов.

Заключение

Использование WP_Meta_Query для работы с сериализованными данными требует понимания структуры данных и правильной организации вложенных условий. Хотя это решение не идеальное, когда речь идёт о производительности запросов и управлении данными, оно позволяет извлекать информацию из метаполей, хранящих массивы, используя встроенные механизмы WordPress.

Для улучшения производительности рекомендуется рассмотреть возможность упрощения структуры данных, например, через использование отдельного метаполя для каждого значения, если это будет применимо в вашем сценарии. Помните, что наилучшим подходом всегда является нормализация данных насколько это возможно.

Следуя этому примеру, вы сможете эффективно фильтровать и извлекать записи на WordPress, используя мета-запросы, которые работают с сериализованными массивами.

Оцените материал
Добавить комментарий

Капча загружается...