在 WordPress 默認(rèn)的數(shù)據(jù)結(jié)構(gòu)中,我們可以注冊(cè)多個(gè)文章類型,可以給每個(gè)文章類型分別添加自定義字段。但是各個(gè)文章類型之間沒有辦法關(guān)聯(lián)起來,這就為文章類型帶來了很大的局限性, posts 2 posts 插件打破了這種局限性,可以把不通的文章類型關(guān)聯(lián)起來,實(shí)現(xiàn)復(fù)雜多變的內(nèi)容關(guān)系。在本文中,我們將創(chuàng)建文章和頁(yè)面的連接,并用幾種不同的方式顯示他們。
注冊(cè)連接
首先,我們需要做的就是注冊(cè)連接,此操作將在文章編輯界面添加一個(gè)文章連接選擇區(qū)域,在主題的functions.php 文件中,添加以下代碼:
add_action( 'p2p_init', function () {
p2p_register_connection_type( [
'name' => 'tests',
'from' => 'game',
'to' => 'question',
'title' => [
'from' => '試題',
'to' => '考試',
],
'from_labels' => [
'singular_name' => __( '考試', 'my-textdomain' ),
'search_items' => __( '搜索考試', 'my-textdomain' ),
'not_found' => __( '沒有找到考試', 'my-textdomain' ),
'create' => __( '添加考試', 'my-textdomain' ),
],
'to_labels' => [
'singular_name' => __( '試題', 'my-textdomain' ),
'search_items' => __( '搜索試題', 'my-textdomain' ),
'not_found' => __( '沒有找到試題', 'my-textdomain' ),
'create' => __( '添加試題', 'my-textdomain' ),
],
'admin_box' => [
'show' => 'from',
'context' => 'advanced',
],
'sortable' => 'any',
'admin_column' => 'to',
'admin_dropdown' => 'to',
] );
} );
直接在functions.php中調(diào)用的 p2p_register_connection_type() 函數(shù)將不會(huì)工作,我們需要像上面代碼中演示的那樣,把此函數(shù)掛載到 ‘p2p_init’ action上。然后,轉(zhuǎn)到文章管理界面添加一些連接,如下圖:

顯示已連接的頁(yè)面/文章
現(xiàn)在,你可能需要在某個(gè)地方顯示這些鏈接,在文章頁(yè)面,我們可以使用 get_queried_object()來獲取當(dāng)前顯示的文章。下面的一段代碼將在文章頁(yè)面顯示連接到此文章的頁(yè)面。
<?php
// 查找鏈接的頁(yè)面
$connected = new WP_Query( array(
'connected_type' => 'posts_to_pages',
'connected_items' => get_queried_object(),
'nopaging' => true,
) );
// 顯示連接的頁(yè)面
if ( $connected->have_posts() ) : ?>
<h3>Related pages:</h3>
<ul>
<?php while ( $connected->have_posts() ) : $connected->the_post(); ?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; ?>
</ul>
<?php
wp_reset_postdata();
endif;
?>
我們也可以反過來,顯示連接到當(dāng)前頁(yè)面的文章,代碼基本上是一樣的,除了放置的文件不同。
- // In single.php
+ // In page.php
- <h3>相關(guān)頁(yè)面:</h3>
+ <h3>相關(guān)文章:</h3>
使用 get_queried_object()
我們可以使用同樣代碼的原因是因?yàn)槲覀兪褂昧艘粋€(gè)特殊的函數(shù) get_queried_object(),該函數(shù)內(nèi)置在WordPress中,根據(jù)當(dāng)前所在的頁(yè)面類型顯示不同的結(jié)果,例如:
- 如果你在文章頁(yè)面,該函數(shù)返回一個(gè)文章對(duì)象。
- 如果你在頁(yè)面,該函數(shù)返回一個(gè)頁(yè)面對(duì)象。
- 如果你在分類頁(yè)面,該函數(shù)返回一個(gè)分類對(duì)象。
有一個(gè)相關(guān)的函數(shù) get_queried_object_id(), 該函數(shù)只返回對(duì)象ID,但是邏輯和上面介紹的是一樣的。
使用 get_posts()
上面的方法也可以使用 get_posts() 函數(shù)實(shí)現(xiàn),只需要多加一個(gè)參數(shù) – 設(shè)置 ‘suppress_filters’ 為 false。例如:
<?php
// 查找相關(guān)文章
$connected = get_posts( array(
'connected_type' => 'posts_to_pages',
'connected_items' => get_queried_object(),
'nopaging' => true,
'suppress_filters' => false
) );
在文章存檔頁(yè)面顯示
上面的代碼是在單頁(yè)面工作的,如果你想為存檔頁(yè)面中的每一篇文章顯示一個(gè)連接列表,你可以使用each_connected()函數(shù)。



可以使用高級(jí)自定義域插件實(shí)現(xiàn)相同功能