2

我有两种帖子类型:艺术家和活动。

我通过在事件编辑器中放置所有艺术家的检查列表来关联艺术家和事件,以便多个艺术家可以与多个事件相关联。事件编辑器上的艺术家自定义字段保存为艺术家帖子 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';} ?>
4

1 回答 1

2

一些想法...

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

我建议使用WP_Query. 这使您可以轻松地通过 meta_key/value 查询帖子:

$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是,当从数据库中检索帖子时,所有相关的帖子元数据也会被提取并缓存在内存中。这意味着get_post_meta()WP_Query循环内部调用不会产生额外的数据库查询,因为这些值存储在内存中,并且get_post_meta()总是首先检查那里是足够明智的。

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

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

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

于 2012-04-18T02:20:00.213 回答