запрос wp проверяет, существует ли целое число в массиве настраиваемого поля


Я использую wp_query для поиска пользовательских записей, которые имеют указанное числовое значение внутри настраиваемого поля. Значение этого настраиваемого поля представляет собой массив чисел (идентификаторы выбранных записей с использованием поля Связи расширенного настраиваемого поля).

Поэтому я пытаюсь найти все записи, которые имеют указанное значение внутри массива этого поля.

Вот мой код:

foreach ($selectedAuthors as $myAuthor){
    $args = array(
        'posts_per_page' => -1,
        'post_type' => 'resource',
        'resource_types' => 'ml-special-reports',
        'meta_query' => array (
            'key' => 'qd_resource_author_selector',
            'value' => $myAuthor,
        ),
        'orderby' => 'title',
        'order' => 'ASC'
    );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) { 
        echo '<h3>'.get_the_title($myAuthor).'</h3>';
        while ( $query->have_posts() ) :
            $query->the_post();
            echo '<h3>'.get_the_title().'</h3>';
        endwhile;
        wp_reset_postdata();
    }
}

Если я var_dump() $selectedAuthors Я получаю:

array(3) { [0]=> int(214) [1]=> int(216) [2]=> int(211) }

Каждый прогон while($query->have_posts()) возвращает каждый сообщение типа resource с термином resource_types таксономии ml-special-reports независимо от того, существует ли $myAuthor в массиве настраиваемого поля qd_resource_author_selector.

Есть какие-нибудь мысли о том, что я делаю неправильно?

Author: Pieter Goosen, 2015-03-06

2 answers

Прежде всего, ваш meta_query это неправильно. Это должен быть массив массива, а не просто массив

Итак, следующее

'meta_query' => array (
    'key' => 'qd_resource_author_selector',
    'value' => $myAuthor,
),

Становится

'meta_query' => array (
    array(
        'key' => 'qd_resource_author_selector',
        'value' => $myAuthor,
    ),
),

Во-вторых, вы можете оптимизировать свой запрос. Вы выполняете запрос для каждого значения. Если у вас есть 100 значений, вы собираетесь выполнить 100 запросов, что дорого

Вы можете оптимизировать свой запрос, добавив свои значения в массив и передав массив непосредственно вашему meta_query

Всего несколько другие проблемы

  • Запустите надлежащий tax_query. Используемый вами синтаксис обесценивается

  • Ваш первый экземпляр get_the_title() выглядит неуместно за пределами петли. Не уверен, что вы там делаете

  • Не смешивайте свой синтаксис, он сбивает с толку и очень трудно отлаживается при сбое. Для вашего заявления if вы используете curlies (которые я предпочитаю, так как в основном все редакторы поддерживают их, очень легко отлаживаются) и в вашем while оператор, который вы используете : и endwhile. Я бы рекомендовал вам использовать кудряшки и придерживаться их в будущем

Учитывая все сказанное, вы можете попробовать что-то подобное без foreach цикла

$myAuthor = array('value1', 'value2', 'value3');
$args = array(
    'posts_per_page' => -1,
    'post_type' => 'resource',
    'tax_query' => array(
        array(
            'taxonomy' => 'resource_types',
            'field'    => 'slug',
            'terms'    => 'ml-special-reports',
        ),
    ),
    'meta_query' => array (
        array(
            'key'       => 'qd_resource_author_selector',
            'value'     => $myAuthor,
            'compare'   => 'IN',
        ),
    ),
    'orderby' => 'title',
    'order' => 'ASC'
);
$query = new WP_Query( $args );
if ( $query->have_posts() ) { 
    while ( $query->have_posts() ) {
        $query->the_post();
        echo '<h3>'.get_the_title().'</h3>';
    }
    wp_reset_postdata();
}
 1
Author: Pieter Goosen, 2015-03-07 03:36:27

Я решил эту проблему, используя часть кода Питера Гусена и более внимательно изучив значение поля в SQL. Это было сохранение информации странным образом, что потребовало от меня заключить значение в кавычки, чтобы вернуть правильные сообщения.

Вот рабочий код:

foreach ($selectedAuthors as $myAuthor){
    echo '<hr /><p>my author = '.$myAuthor.'</p>';  
    $args = array(
        'posts_per_page' => -1,
        'post_type' => 'resource',
        'tax_query' => array(
            array(
                'taxonomy' => 'resource_types',
                'field'    => 'slug',
                'terms'    => 'ml-special-reports',
            ),
        ),
        'meta_query' => array (
            array(
                'key' => 'qd_resource_author_selector',
                'value' => '"'.$myAuthor.'"',
                'compare' => 'LIKE',                       
            ),
        ),
        'orderby' => 'title',
        'order' => 'ASC'
        );
    $query = new WP_Query( $args );
    if ( $query->have_posts() ) { 
        echo '<h3>'.get_the_title($myAuthor).'</h3>';
        while ( $query->have_posts() ) {
            $query->the_post();
            echo '<h3>'.get_the_title().'</h3>';
        }
        wp_reset_postdata();
    }
}

Поэтому в этой строке мне пришлось заставить появиться кавычки:

'value' => '"'.$myAuthor.'"',

Теперь он возвращает имя автора, а затем название каждой записи с правильным термином таксономии, который им присвоен до.

 0
Author: Joe, 2015-03-09 15:02:04