2012-04-18 25 views
2

アーティストとイベントの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

+0

** Modsへの注意**:この質問はWPSEに適しています。 –

答えて

2

いくつかの考え...

をそれはあなたのイベントの投稿を取得するためにWP_Queryクラスを使用しているかどうか、あなたの例に基づいて明らかではありません。 tribe_get_events()関数に渡された引数は、ちょうどget_posts()を使用してイベント投稿を取得していることを示しています。

WP_Queryを使用して2次ループをお勧めします。これは簡単に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を使用すると、データベースからポストを取得するときに、関連付けられたポストメタがすべてメモリにキャッシュされてキャッシュされるという利点があります。つまり、get_post_meta()WP_Queryループ内から呼び出すと、データベースにクエリが追加されることはありません。これらの値はメモリに格納されており、常に最初にチェックするのが賢明です。

あなたの質問のヒントは、多くの人がWordPressの欠点と考えている問題です。ポストを投稿に関連付けるための標準的な防御機能を内蔵していません。血みどろの詳細について

、このTracのチケットにコメントスレッドをチェックアウト: http://core.trac.wordpress.org/ticket/14513

多対多の関係を保持するために、新しいデータベーステーブルを作成することで問題を回避取得する人気のプラグイン: http://wordpress.org/extend/plugins/posts-to-posts/

関連する問題