Wordpress + PHP:查询帖子以查找包含包含特定键的自定义字段数组的帖子


Wordpress + PHP: Query posts to find those that contain a custom field array which contains a specific key

我有两种帖子类型:艺术家和事件。

我通过在事件编辑器中放置所有艺术家的检查列表来关联艺术家和事件,以便可以将多个艺术家与多个事件相关联。活动编辑器上的艺术家自定义字段将另存为艺术家帖子 ID 数组。

在活动页面上,我显示了每个活动的艺术家列表,如下所示:

    //Get Event Artists
    $postID = $post->ID;
    $meta = get_post_meta($postID, $_artistMeta->$postID, TRUE);
    $artists = unserialize($meta['_artistMeta'][0]);
    $output = array();
    foreach ($artists['artistName'] as $artist) {
        $theArtist = get_post($artist);
        $output[] = '<li><a href="'.get_permalink($theArtist->ID).'">'.$theArtist->post_title.'</a></li>';
    }
<?php if($output) { ?>
                                <div class="tw-event-artists bg1">
                                    <ul class="nav-inl group me c2 comma-list">
                                        <li class="bo"><?php echo $featured; ?>:</li>
                                        <?php echo implode('', $output); ?>
                                    </ul>
                                </div>
<?php } ?>

我现在试图找到的问题是尝试"反向"。因此,在我的艺术家档案中,我想找到每位艺术家的最新活动。

我需要创建一个自定义查询来查找其艺术家数组包含当前艺术家 slug 的事件帖子。

我认为 http://css-tricks.com/snippets/wordpress/custom-loop-based-on-custom-fields/教程是一个很好的起点,但我的 PHP 印章根本不足以破解它。

如何编写此查询以获取我想要的内容?

谢谢!


我目前实现这一点的方法就是这样,放在我的艺术家存档模板的循环中,但我想这将非常缓慢和低效,因为它必须为每个艺术家获取每一个事件。

<?php 
    $artistID = $post->ID;
    $args = array(
        'eventDisplay'=> 'upcoming',
        'posts_per_page' => -1
    );  
    $events = tribe_get_events($args);
    $has_date = false;
    if ($events):
        global $post;
        foreach ($events as $post):
            setup_postdata($post);
            //Get Event Artists
            $postID = $post->ID;
            $meta = get_post_meta($postID, $_artistMeta->$postID, TRUE);
            $artists = unserialize($meta['_artistMeta'][0]);
            foreach ($artists['artistName'] as $artist) {
                if($artist == $artistID) {$has_date = true;}    
            }
        endforeach;
    endif;
?>
<?php if($has_date) {echo 'HAS DATE';} ?>

一些想法...

根据您的示例,不清楚您是否正在使用 WP_Query 类来检索您的活动帖子。 传递给tribe_get_events()函数的参数表明您只是使用 get_posts() 来检索事件帖子。

我建议使用 WP_Query 进行辅助循环。 这使您可以按meta_key/值轻松查询帖子:

$query_args = array( 'post_type' => 'event', 'meta_key' => '_artist_id', 'meta_value' => '5' );
$event_query = new WP_Query( $query_args );
if( $event_query->have_posts() ) {
    while( $event_query->have_posts() ) {
        $event_query->the_post();
        ...
        // standard loop stuff goes here

这将仅返回_artist_id值为 5 的事件帖子。

有关详细信息,请参阅此页面:http://codex.wordpress.org/Class_Reference/WP_Query#Custom_Field_Parameters

需要注意的是,您不能将其与序列化的后元值一起使用。 如果要按元值查询,则需要修改存储事件/艺术家数据的方式,以将要查询的字段分解为自己的单个帖子元字段。

但是,使用 WP_Query 的一个不错的好处是,当从数据库中检索帖子时,它们的所有关联的帖子元也会被获取并缓存在内存中。 这意味着从WP_Query循环内部调用get_post_meta()不会生成其他数据库查询,因为这些值存储在内存中,并且get_post_meta()足够明智,始终首先检查那里。

你的问题暗示的一个更大的问题是许多人认为WordPress的缺点 - 它没有提供将帖子与帖子相关联的防弹内置标准化机制。

有关血腥的细节,请查看此trac票证上的评论线程:http://core.trac.wordpress.org/ticket/14513

一个流行的插件,通过创建一个新的数据库表来保存多对多关系来解决这个问题:http://wordpress.org/extend/plugins/posts-to-posts/