Я использую плагин Code Snippets и Advance Custom Fields. Я использую фрагмент кода с WP_QUERY для получения сообщений из базы данных. Я пытаюсь получить значение из поля повторителя. Это не мой проект, поэтому я не могу изменить поле повторителя. Так что мне придется иметь дело с. Это запрос.
$args = array(
'numberposts' => $limit,
'post_type' => 'opleidingen',
'orderby' => 'meta_value',
'suppress_filters' => 'false',
'meta_query' => array(
array(
'key' => 'data_$_startdatum',
'value' => $today,
'compare' => '>',
),
),
'order' => $order,
);
$the_query = new WP_Query( $args );
Я пытаюсь сравнить текущую дату с данными _ $ _ startdatum, где startdatum - это подполе. Я прочитал здесь https://www.advancedcustomfields.com/resources/query-posts-custom-fields/, что это способ сравнения в подполе. Но если я запускаю запрос, я получаю 0 сообщений.
Я проверил, работает ли запрос, заменив $ на 0, и это работает. Но только для первого индекса поля повторителя. Если я использую оператор OR и добавляю массивы с data_0_startdatum к data_10_startdatum, это работает для первых 10 индексов. Вот так
$args = array(
'numberposts' => $limit,
'post_type' => 'opleidingen',
'orderby' => 'meta_value',
'suppress_filters' => 'false',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'data_0_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_1_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_2_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_3_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_4_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_5_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_6_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_7_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_8_startdatum',
'value' => $today,
'compare' => '>',
),
array(
'key' => 'data_9_startdatum',
'value' => $today,
'compare' => '>',
)
),
'order' => $order,
);
Но я бы хотел, чтобы он работал на всю длину массива. Начиная с Wordpress 4.8.3, вы не можете использовать%, и вам придется использовать фильтр post_where, чтобы заменить% на LIKE. Я попытался сделать это, внедрив в свои функции следующий код: php
function my_posts_where( $where ) {
echo($where);
$where = str_replace("meta_key = 'data_$", "meta_key LIKE 'data_%", $where);
return $where;
}
add_filter('posts_where', 'my_posts_where');
Это не сработало. Поэтому я попытался создать фрагмент с плагином code snippets и придать ему высокий приоритет, но это тоже не сработало. Я также попытался дать ему низкий приоритет, и это тоже не сработало. Я вставил эхо в фильтр и получил следующее при просмотре сообщения в браузере
AND (wp_posts.ID = '610') AND wp_posts.post_type = 'page' AND wp_posts.post_type = 'wpmm_theme' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled' OR wp_posts.post_author = 6 AND wp_posts.post_status = 'private') AND (wp_posts.ID = '610') AND wp_posts.post_type = 'page' AND (wp_posts.ID = '610') AND wp_posts.post_type = 'page'
Мой запрос там отсутствует? Я получаю этот результат, когда помещаю фильтр в свои функции. php или в отдельный фрагмент с высоким или низким приоритетом.