2012-04-18 76 views
2

我有两个职位类型:艺术家和事件。WordPress的+ PHP的:查询帖子找到那些包含自定义字段数组,其中包含一个特定的键

我已经把在事件编辑器所有艺术家的检查列表相关的艺术家和活动,以便多个艺术家可以与多个事件相关联。活动编辑器上的艺术家自定义字段将保存为艺术家帖子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 } ?> 

我想现在发现的问题是,试图“去反”。所以在我的艺术家档案中,我想找到每位艺术家的最新活动。

我需要创建一个自定义查询发现事件的帖子,其艺术家阵列包含当前艺术家塞。

我认为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';} ?> 
+2

这可能有所帮助:http://wordpress.stackexchange.com/a/11051 – micahwittman 2012-04-18 01:40:58

+0

**对mods的注意**:这个问题会更适合WPSE。 – 2012-04-18 16:08:00

回答

2

的一点想法...

,目前还不清楚你是否正在使用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 

这将返回唯一事件职位,有5。

_artist_id值详见本页面: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/

相关问题