Запрос сообщений, отфильтрованных по пользовательскому полю post_object

Я пытаюсь запросить любой пост, для которого в качестве «родителя» выбран определенный объект post_object. Родительское значение должно совпадать с идентификатором текущего сообщения. Я смог воспроизвести эту функциональность, запросив все сообщения этого типа, а затем сравнив значения в цикле, например:

<?php
    $wp_query = new WP_Query();
    $wp_query->query(  array (
        'post_type' => 'my_post_type',
        'meta_key'=>'post_object_field'
)); 

if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    <?php 
    $parent = get_field('post_object_field'); 
    $parentId = $parent->ID; ?>

    <?php if ($postId == $parentId): ?>

        // content 

    <?php endif; ?>
<?php endwhile; endif; ?>

Мне интересно, есть ли способ проверить это значение внутри запроса, и если да, то быстрее или правильнее.


person johnnyd23    schedule 29.03.2014    source источник


Ответы (3)


Чтобы получить все сообщения/страницы, которые являются дочерними элементами данного сообщения/страницы, вы можете использовать параметр post_parent, используя идентификатор родительского сообщения.

Например, если у вас есть пост

$wp_query->query(  array (
    'post_type'    => $children_post_type
    'post_parent'  => $postId
)); 

И, конечно, да, выполнение запроса будет намного эффективнее, чем выполнение запроса + получение значения поля + создание переменной + зацикливание результатов для сравнения...


EDIT: Судя по вашим комментариям, кажется, что вы на самом деле пытаетесь получить все те сообщения, которые имеют заданное значение в пользовательском поле типа Post Object. . Это поле содержит число, которое является идентификатором сообщения, к которому оно относится, поэтому вам просто нужно добавить параметр meta_value_num в вашем запросе:

$wp_query->query(  array (
    'post_type'      => 'my_post_type',
    'meta_key'       => 'post_object_field'
    'meta_value_num' => $postId
));

Это позволит получить все сообщения, которые имеют настраиваемое поле с именем post_object_field со значением $postId.


ИЗМЕНИТЬ. Попробуйте следующее:

$args = array(
'post_type'  => 'my_post_type',
'meta_query' => array(
    array(
        'key'     => 'post_object_field',
        'value'   => $postId,
        'compare' => '='
    )
)
);
person MikO    schedule 29.03.2014
comment
Спасибо за ответ, но я должен был быть более конкретным. Родительский тип сообщения отличается от дочернего. Есть ли способ назначить эти отношения между типами сообщений? - person johnnyd23; 30.03.2014
comment
@johnnyd23, в запросе вы должны использовать post_type детских сообщений! Или вообще не устанавливайте post_type (как я редактировал). Таким образом, вы будете получать все дочерние элементы вашего родительского сообщения, независимо от их типа сообщения... - person MikO; 30.03.2014
comment
Я уже запрашиваю по типу сообщения. Мне нужно запросить по типу сообщения, а также по значению настраиваемого поля. Это настраиваемое поле является post_object, и проблема в том, что я не знаю, как проверить значение этого post_object. - person johnnyd23; 30.03.2014
comment
@johnnyd23, значит, вы не хотите получать те посты, которые являются дочерними для данного поста, но вы хотите получать те посты, в которых есть настраиваемое поле с заданным значением, верно? - person MikO; 30.03.2014
comment
правильно, я не могу назначать сообщения дочерними, поскольку они относятся к другому типу сообщений, чем их родитель - person johnnyd23; 30.03.2014
comment
@johnnyd23, посмотри мой РЕДАКТИРОВАТЬ. Если это не то, что вы имеете в виду, попробуйте переписать свой вопрос, потому что я его не понимаю... - person MikO; 30.03.2014
comment
Я понимаю, как проверить определенное значение, но, похоже, вы не можете проверить значение поля post_object таким образом. - person johnnyd23; 30.03.2014
comment
@johnnyd23, извините, я не знаю, что вы имеете в виду под полем post_object - person MikO; 30.03.2014
comment
@ johnnyd23, хорошо, я переписал свой РЕДАКТИРОВАТЬ. Это поле содержит число, которое является идентификатором post_object, к которому оно относится. Таким образом, вы должны иметь возможность запрашивать его, используя 'meta_value_num' => $postId. - person MikO; 30.03.2014
comment
Это не работает. Поле возвращает не идентификатор, а сам объект сообщения, как в codex.wordpress.org/Class_Reference/ WP_Пост - person johnnyd23; 30.03.2014
comment
@johnnyd23, поле Post Object возвращает WP_Object, если вы используете функцию get_field(). Но если вы изучите таблицу БД wp_postmeta, вы увидите, что в БД хранится идентификатор связанного сообщения (просто число) в качестве значения поля. Функция ACF get_field() использует этот идентификатор, чтобы дать вам WP_Object, но вы должны иметь возможность выполнять запросы, используя идентификатор! Вы уверены, что используете правильный post_type, meta_key и meta_value_num, и запрос ничего не возвращает ? - person MikO; 30.03.2014
comment
Я на 100% уверен, что использую правильную информацию. Запрос по-прежнему извлекает все сообщения my_post_type, которые имеют post_object_field. Добавление meta_value_num ничего не меняет. - person johnnyd23; 30.03.2014
comment
На самом деле я только что попробовал это, и это сработало, и я сам опубликовал ответ. Я также отмечу ваше как правильное. Спасибо за вашу помощь - person johnnyd23; 30.03.2014
comment
@johnnyd23, нет проблем! Не знаю, зачем вам meta_query, но я рад, что вы разобрались! - person MikO; 30.03.2014

<?php
$wp_query = new WP_Query();
$wp_query->query(  array (
    'post_type' => 'my_post_type',
    'meta_query' => array(
        array(
            'key' => 'post_object_field',
            'value' => $postId,
            'compare' => '=='
        )
     )
)); 

если ( have_posts() ) : в то время как ( have_posts() ): the_post(); ?>

// content 

enter code here

person sdfgfdg    schedule 20.09.2014

Мне удалось отфильтровать результаты в запросе, используя:

<?php
    $wp_query = new WP_Query();
    $wp_query->query(  array (
        'post_type' => 'my_post_type',
        'meta_query' => array(
            array(
                'key' => 'post_object_field',
                'value' => $postId,
                'compare' => '=='
            )
         )
    )); 

if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

    // content 

<?php endwhile; endif; ?>
person johnnyd23    schedule 30.03.2014