Wordpress&x2B;PHP:查询POST以查找包含自定义字段数组(其中包含特定键)的POST

Wordpress&x2B;PHP:查询POST以查找包含自定义字段数组(其中包含特定键)的POST,php,arrays,wordpress,Php,Arrays,Wordpress,我有两种帖子类型:艺术家和事件 通过在事件编辑器中放置所有艺术家的检查列表,我将艺术家与事件关联起来,以便多个艺术家可以与多个事件关联。事件编辑器上的艺术家自定义字段保存为艺术家帖子ID数组 在“活动”页面上,我显示了每个活动的艺术家列表,包括以下内容: //Get Event Artists $postID = $post->ID; $meta = get_post_meta($postID, $_artistMeta->$postID, TRUE);

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

通过在事件编辑器中放置所有艺术家的检查列表,我将艺术家与事件关联起来,以便多个艺术家可以与多个事件关联。事件编辑器上的艺术家自定义字段保存为艺术家帖子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 } ?>
//获取事件艺术家
$postID=$post->ID;
$meta=get\u post\u meta($postID,$\u artistMeta->$postID,TRUE);
$artists=unserialize($meta[''u artistMeta'][0]);
$output=array();
foreach($artists['artistName']作为$artist){
$theArtist=get\u post($artist);
$output[]='
  • '; }
    我现在试图找到的问题是尝试“反向走”。因此,在我的艺术家档案中,我想找到每位艺术家的最新活动

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

    我认为这个教程是一个很好的起点,但我的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_查询类来检索事件帖子。传递给
    grabe\u get\u events()
    函数的参数表明您只是在使用
    get\u posts()
    检索事件帖子

    我建议使用
    WP\u Query
    进行二次循环。这使您可以通过meta_键/值轻松查询帖子:

    $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
    
    这将只返回
    \u artist\u id
    值为5的事件帖子

    有关详细信息,请参见本页:

    需要注意的是,不能将其用于序列化的post元数据。如果您想按元值进行查询,则需要修改存储事件/艺术家数据的方式,以将要按元值进行查询的字段拆分为它们自己的单个post元字段

    然而,使用
    WP\u Query
    的一个很好的好处是,当从数据库检索帖子时,所有相关的帖子元也会被提取并缓存在内存中。这意味着从
    WP\u Query
    循环内部调用
    get\u post\u meta()
    将不会生成额外的数据库查询,因为这些值存储在内存中,
    get\u post\u meta()
    非常明智,总是先检查那里

    <> P>一个更大的问题,你的问题是很多人认为是WordPress的一个缺点——它没有提供一个安全的内置的标准化机制来将文章联系到帖子。

    有关血淋淋的详细信息,请查看此trac票证上的评论线程:

    一个流行的插件,通过创建一个新的数据库表来保存多对多关系来解决这个问题:

    这可能会有帮助:mods注意:这个问题更适合WPSE。