在 WordPress 默认的数据结构中,我们可以注册多个文章类型,可以给每个文章类型分别添加自定义字段。但是各个文章类型之间没有办法关联起来,这就为文章类型带来了很大的局限性, posts 2 posts 插件打破了这种局限性,可以把不通的文章类型关联起来,实现复杂多变的内容关系。在本文中,我们将创建文章和页面的连接,并用几种不同的方式显示他们。
注册连接
首先,我们需要做的就是注册连接,此操作将在文章编辑界面添加一个文章连接选择区域,在主题的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中调用的 p2p_register_connection_type() 函数将不会工作,我们需要像上面代码中演示的那样,把此函数挂载到 ‘p2p_init’ action上。然后,转到文章管理界面添加一些连接,如下图:
显示已连接的页面/文章
现在,你可能需要在某个地方显示这些链接,在文章页面,我们可以使用 get_queried_object()来获取当前显示的文章。下面的一段代码将在文章页面显示连接到此文章的页面。
'posts_to_pages', 'connected_items' => get_queried_object(), 'nopaging' => true, ) ); // 显示连接的页面 if ( $connected->have_posts() ) : ?>Related pages:
-
have_posts() ) : $connected->the_post(); ?>
- ">
我们也可以反过来,显示连接到当前页面的文章,代码基本上是一样的,除了放置的文件不同。
- // In single.php + // In page.php -相关页面:
+相关文章:
使用 get_queried_object()
我们可以使用同样代码的原因是因为我们使用了一个特殊的函数 get_queried_object(),该函数内置在WordPress中,根据当前所在的页面类型显示不同的结果,例如:
如果你在文章页面,该函数返回一个文章对象。如果你在页面,该函数返回一个页面对象。如果你在分类页面,该函数返回一个分类对象。有一个相关的函数 get_queried_object_id(), 该函数只返回对象ID,但是逻辑和上面介绍的是一样的。
使用 get_posts()
上面的方法也可以使用 get_posts() 函数实现,只需要多加一个参数 – 设置 ‘suppress_filters’ 为 false。例如:
'posts_to_pages', 'connected_items' => get_queried_object(), 'nopaging' => true, 'suppress_filters' => false ) );
在文章存档页面显示
上面的代码是在单页面工作的,如果你想为存档页面中的每一篇文章显示一个连接列表,你可以使用each_connected()函数。