Вопрос или проблема
Как я могу использовать повторяющееся поле с meta_query? У меня есть повторяющееся поле с некоторыми текстовыми значениями и форма, которая отправляет переменные на страницу, где я получаю значение и сохраняю значение, которое является ЗНАЧЕНИЕМ в meta_query. Я хочу получить все CPT, которые имеют определенную строку в повторяющемся поле, например:
if(isset($_GET['tecnology'])){
$tech = $_GET['tecnology'];
echo $tech;
}
if(isset($_GET['category'])){
$cat = $_GET['category'];
echo $cat;
}
if(isset($_GET['start'])){
$star_point = $_GET['start'];
echo $star_point;
}
$args = array(
'post_type' => 'project',
'posts_per_page' => -1,
'orderby' => 'post_date',
'meta_query' => array(
array(
'key' => 'tecnologies',
'value' => $tech,
'compare' => 'LIKE'
),
array(
'key' => 'category_project',
'value' => $cat,
'compare' => 'LIKE'
),
array(
'key' => 'route', //это повторяющееся поле
'value' => $star_point, //это строка, которую я хочу узнать, есть ли она в повторяющемся поле
'compare' => 'LIKE'
)
)
);
$loop_servicios = new WP_Query( $args );
?>
Я не думаю, что это возможно. ACF хранит данные повторяющегося поля в отдельных полях postmeta – одна строка базы данных для каждого поля в повторяющемся поле – поэтому вам придется запрашивать несколько полей, и если у вас всегда не одно и то же количество повторяющихся полей, вы даже не будете знать, сколько запрашивать.
Кажется, будет лучше структурировать ваши данные немного более сложно, создав пользовательские таксономии. Запросы таксономий также намного быстрее, чем запросы метаданных, поэтому производительность будет гораздо лучше.
Ответ или решение
Чтобы использовать поле повторитель (repeater field) с мета-запросом (meta_query) в WordPress с плагином Advanced Custom Fields (ACF), необходимо учитывать, как ACF хранит данные. Поля повторителей сохраняются как отдельные метаполя, что делает задачу с использованием одноуровневого meta_query
более сложной, чем это кажется на первый взгляд.
Проблема с запросами метаполей
Когда вы сохраняете значения в поле повторителя, например, route
, каждое значение записывается в отдельную строку в базе данных с уникальным ключом. Если, например, у вас есть массив значений ‘route’ с ключами route_0
, route_1
, и так далее, вам придется точно знать, сколько значений у вас есть, чтобы использовать meta_query
для поиска их.
Выполнение запроса с мета-запросами
В вашем примере с meta_query
вы пытаетесь выполнить запрос к пользовательскому типу записи (CPT) ‘project’, чтобы найти записи с определенными значениями. Вот пример того, как вы можете улучшить ваш код, чтобы более эффективно искать значения в повторителе:
if ( isset( $_GET['tecnology'] ) ) {
$tech = sanitize_text_field( $_GET['tecnology'] );
}
if ( isset( $_GET['category'] ) ) {
$cat = sanitize_text_field( $_GET['category'] );
}
if ( isset( $_GET['start'] ) ) {
$star_point = sanitize_text_field( $_GET['start'] );
}
$args = array(
'post_type' => 'project',
'posts_per_page' => -1,
'orderby' => 'post_date',
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'tecnologies',
'value' => $tech,
'compare' => 'LIKE'
),
array(
'key' => 'category_project',
'value' => $cat,
'compare' => 'LIKE'
),
array(
'key' => 'route', // ключ поля повторителя
'value' => $star_point,
'compare' => 'LIKE'
)
)
);
$loop_servicios = new WP_Query( $args );
// Обработка результатов
if ( $loop_servicios->have_posts() ) {
while ( $loop_servicios->have_posts() ) {
$loop_servicios->the_post();
// Ваш код для отображения записи
}
} else {
echo 'Записи не найдены';
}
wp_reset_postdata();
Рекомендации по оптимизации структуры данных
Хотя вышеприведенный код может помочь вам в текущей задаче, вам стоит серьезно рассмотреть возможность использования пользовательских таксономий вместо повторителей. Это связано с следующими преимуществами:
-
Производительность: Запросы к таксономиям, как правило, выполняются быстрее, чем запросы к метаполям, поскольку таксономии хранятся более эффективно.
-
Упрощение запросов: Используя таксономии, вы сможете легче манипулировать и фильтровать данные, не беспокоясь о количестве значений в каждом повторителе.
-
Гибкость: Разделение данных на различные термины таксономий позволяет вам лучше организовать данные и улучшить пользовательский интерфейс.
Заключение
Используйте приведенные выше методы для работы с мета-запросами и помните о возможных альтернативных структурах данных, таких как пользовательские таксономии, которые могут значительно повысить производительность и упростить вашу работу с данными в будущем. Надеюсь, что это предоставит вам четкое направление для дальнейшей работы.