2

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

私が今見つけようとしている問題は、「逆に行く」ことです。そのため、アーティストのアーカイブで、各アーティストの最新のイベントを見つけたいと考えています。

アーティスト配列に現在のアーティスト スラッグが含まれているイベント投稿を検索するには、カスタム クエリを作成する必要があります。

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 の欠点であると考えているものです。WordPress は、投稿を投稿に関連付けるための標準化された防弾メカニズムを提供していません。

詳細については、この trac チケットのコメント スレッドを参照してください: http://core.trac.wordpress.org/ticket/14513

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

于 2012-04-18T02:20:00.213 に答える