自定义查询:连接来自两个自定义发布类型的元值

时间:2018-07-28 作者:Pete Hayman

嗨,我希望这是问这个问题的好地方。

我正在将我的整个足球俱乐部网站移动到Wordpress上,因此使用一个数据库来获取我所掌握的信息。从长远来看,我这样做是为了让事情变得更容易。

以前,有一个用于对手、比赛、球员等的数据库表。现在我有了这些的自定义帖子类型。这些表中的每个条目都有一个唯一的ID,可以在适当的情况下在其他表中引用:对手ID、比赛ID、球员ID等等。

例如,在比赛页面中,我会从包含连接的对手和球员表中提取和输出数据,其中一个基本示例是:

$query = "SELECT me.date, me.opponent, me.score, ce.name, ce.ID, me.ID, ce.badge FROM  
matchengine me RIGHT JOIN clubengine ce ON me.opponent=ce.ID WHERE me.ID = ".$id."";
从这里,我得到

me.date      ce.name (from ID)    me.score
==========================================
01/01/1900   Team Name United     2-1
而不是

me.date      ce.id                me.score
==========================================
01/01/1900   200                  2-1
我还没能在Wordpress中复制这一点。我可以从单个帖子类型(即匹配)中输出信息,但还没有找到从另一个帖子类型中提取相关数据的方法(如果有)。我的直觉是在共享的meta\\u值或meta\\u键上加入两种帖子类型?

编辑(8月11日):我所做的是采纳了@SallyCJ的建议,让对手字段成为一个Post对象(最终找到了如何像这样从CSV导入数据!)。在调用“Match”帖子的查询中使用以下代码,我能够输出球队名称,而不仅仅是三位数的ID代码。我相信这在Wordpress圈子里是很粗糙的,但它对我来说确实有用。

$opposition = get_field(\'club\');
if($opposition) echo $opposition->post_title;

1 个回复
SO网友:Sally CJ

因此,根据我们的讨论,元命名为opposition (用于match 将其值设置为相应club 邮递e、 g。club-1, club-two, 等等,对吧?

如果是,那么您首先获得club 使用自定义查询发布(请参见下面的代码),然后您可以从club 帖子,如帖子标题和内容。只需确保始终检查post ID(由$club_id 在下面的代码中)大于0 (零),因为否则您得到的数据将是foreach 回路,用于当前match 发布而不是club 与之关联的帖子match 邮递(我希望你能理解这一点。)

if ( $latestresult )
{
    foreach ( $latestresult as $post )
    {
        setup_postdata( $post );

        // Get the ID of the `club` post associated with the current `match` post.
        $club_id = $wpdb->get_var( $wpdb->prepare( "
            SELECT ID
            FROM $wpdb->posts
            WHERE post_name = %s
            AND post_type = \'club\'
        ", get_field( \'opposition\', $post->ID ) ) );

        // Don\'t use `get_the_title()` with a zero value; so check if $club_id > 0
        $player_name = $club_id > 0 ? get_the_title( $club_id ) : \'N/A\';
    ?>
    ...
    <div class="result-info">       
    <a href="<?php the_permalink(); ?>">
    ...
    <span class="result-column"><?php echo $player_name; ?></span>
    ... 
    <span class="thumbnail">
        <?php echo get_the_post_thumbnail( $club_id, \'thumbnail\' ); ?>
    </span>
    </a>
    </div>
    <?php
    }   
}
但是,如果可能,您最好将ACF字段类型更改为Post Object, 其中,元值是club 而不是它的鼻涕虫。但为此,请确保将“允许Null”设置为“是”,并将“选择多个值”设置为“否”&mdash;看见this image.

如果你能做到这一点,那么代码将是simpler:

if ( $latestresult )
{
    foreach ( $latestresult as $post )
    {
        setup_postdata( $post );

        // Get the ID of the `club` post associated with the current `match` post.
        // Set the third argument to `false` to get the post ID instead of object.
        $club_id = get_field( \'opposition\', $post->ID, false );

        // Don\'t use `get_the_title()` with a zero value; so check if $club_id > 0
        $player_name = $club_id > 0 ? get_the_title( $club_id ) : \'N/A\';
    ?>
    ...
    <div class="result-info">       
    <a href="<?php the_permalink(); ?>">
    ...
    <span class="result-column"><?php echo $player_name; ?></span>
    ... 
    <span class="thumbnail">
        <?php echo get_the_post_thumbnail( $club_id, \'thumbnail\' ); ?>
    </span>
    </a>
    </div>
    <?php
    }   
}
附加说明尽管此代码有效:

$latestresult = $wpdb->get_results( 
"SELECT * FROM $wpdb->wp_posts
WHERE p.post_type = \'match\'
ORDER BY post_date DESC
LIMIT 2"
);
我是用get_posts():

$latestresult = get_posts( [
    \'post_type\'      => \'match\',
    \'orderby\'        => \'date\',
    \'order\'          => \'DESC\',
    \'posts_per_page\' => 2, // LIMIT
] );
因为在WordPress中,我们应该这样做(另一种方法是使用new WP_Query( [ ... ] ).)

结束

相关推荐

使用jQuery显示/隐藏DIV-不能在一个页面中工作

两天来我只和一件事斗争。。。但我只是放弃了!我已经做了一个JSFIDLE来检查它,可能是我的代码错了或其他什么。。但是该代码在JSFIDLE上运行良好,但在我的this页面(在另一个子页面上,该代码运行正常)上则不行。。。我使用WPJob Manager Resumes... 我按代码生成页面[简历]按插件WPBakery Page Builder 我将自定义JS添加到子页面。所有代码的工作方式都类似于:alert(“test”),但不适用于以下情况: <script> jQue