Хорошо, мне нужно получить все сообщения, к которым относится текущий пост. Это устанавливается через поле отношений в запрошенных сообщениях, а не в моем текущем. Но странность в том, что поле отношения вложено в поле повторителя для повторяющихся блоков на странице. Итак, в моем "block_repeater" есть поле отношения "block_relations", и мой запрос выглядит так:

$args = array(
            'post_type' => array('post', 'page'),
            'meta_key' => 'block_relations',
            'value' => '"' . $post->ID . '"',
            'compare' => 'LIKE',
        );
$q = new WP_Query($args);

Этот запрос ничего не возвращает, и я думаю, что это из-за вложенности. В таблице postmeta моей базы данных запись для «block_relations» выглядит как «blocks_0_block_relations», «blocks_1_block_relations» и так далее. Есть ли способ сделать это в одном запросе, а не запрашивать все сообщения, у которых есть повторитель «блоков», а затем использовать foreach для получения моего поля и проверки того, имеет ли оно соответствующее значение?

0
DoktorD 22 Окт 2018 в 16:08

2 ответа

Лучший ответ

Я нашел решение, и оно не очень хорошее. Проблема в том, что вам нужно использовать ключи «blocks_0_block_relations», но метазапрос ищет meta_key с оператором equals (=), поэтому вам нужно создать собственный фильтр, чтобы отфильтровать ваш конкретный запрос и изменить его, чтобы использовать сравнение LIKE. решение:

$args = array(
    'post_type' => array('post', 'page'),
    'meta_query' => array( 
        array(
            'key' => 'blocks_$_block_relations',
            'value' => $post->ID,
            'compare' => 'LIKE',
             ) 
        ),
    );
$q = new WP_Query($args);

И настраиваемый фильтр для изменения предложения where:

function my_posts_where( $where ) { 
    $where = str_replace("meta_key = 'blocks_$", "meta_key LIKE 'blocks_%", $where);
    return $where;
}

add_filter('posts_where', 'my_posts_where');
0
DoktorD 22 Окт 2018 в 14:25

У вас неправильный массив $ args

$args = array(
    'post_type' => array('post', 'page'),
    'meta_query' => array( array(
      'key' => 'block_relations',
      'value' => $post->ID,
      'compare' => 'LIKE',
    ) )
);
$q = new WP_Query($args);
0
Vitali Protosovitski 22 Окт 2018 в 13:41
52930198