Почему мой фильтр не перехватывает мой wp-запрос? - PullRequest
0 голосов
/ 06 февраля 2020

Я использую плагин 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 или в отдельный фрагмент с высоким или низким приоритетом.

1 Ответ

0 голосов
/ 06 февраля 2020

Лучше было бы динамически составлять WP_Query (). Изменение предложения where на лету с помощью str_replace является плохой практикой и может легко вызвать ошибки.

Попробуйте выполнить следующее:

$nrOfFieldsToCheck = 20; // Find the number of fields to check or use a constant
$buf = ['relation' => 'OR'];

// Compose the array of conditions
for($i=0;$i < $nrOfFieldsToCheck; $i++)
{
   $buf[] = [
        'key'     => sprintf('data_%d_startdatum',$i),
        'value'   => $today,
        'compare' => '>'
   ];
}

$args = [
    'numberposts'   => $limit,
    'post_type'     => 'opleidingen',
    'orderby'           => 'meta_value',
    'suppress_filters' => 'false',
    'meta_query' => $buf,
    'order' => $order
];
$the_query = new WP_Query( $args );

Кроме того, я не знаю, что str_replace поддерживает использование подстановочные знаки. Ваш фильтр не работает, потому что он не находит $ needle в строковом значении $ haystack.

...