如何在 WordPress 标签页上显示帖子和页面?
How to display posts and pages on a WordPress tag page?
向 WordPress 页面添加标签
当我在 WordPress 标签页上时,我尝试显示带有相同标签的帖子和页面。我正在使用一些自定义代码来将标签功能添加到 WordPress 页面。向页面添加标签是可行的,当我在页面模板中使用 <?php the_tags(); />
时,我也可以在页面上显示标签。
我正在使用此代码(在我的子主题 functions.php 中)将标签功能注册到页面:
// Add tag support to pages
function tags_support_all() {
register_taxonomy_for_object_type('post_tag', 'page');
}
add_action('init', 'tags_support_all');
问题 - 带有标签的页面没有显示在标签页上
我似乎找不到让这些页面显示在标签页上的方法。它只显示标有相同标签的帖子。没有页面。我使用下面的代码尝试通过将 post_type 设置为 'any' 来更新 pre_get_posts 查询。这是我在 Google 上找到的一个(旧)片段,为什么我正在寻找解决方案。我不确定这是否仍然可行,但我找不到任何可行的替代方案。
// Display all post types on tag pages
function tags_support_query($wp_query) {
if ($wp_query->get('tag')) {
$wp_query->set('post_type', 'any');
}
}
add_action('pre_get_posts', 'tags_support_query');
关于如何让它工作有什么想法吗?
一些额外信息:
- WordPress 版本 5.7.2.
- 我正在使用主题和(自定义)子主题组合。主题使用古腾堡编辑器。
- 以上代码片段添加到子主题functions.php
- 没有具体的 tag.php 或 archive.php。标签页使用默认的index.php显示标签页。这个index.php也用在类别、档案等
创建一个可用于所有标签的新文件并将其命名为 tag.php
。这将允许该文件呈现所有标签相关的存档页面。其他类别和档案将保持不变。
在这个新文件中复制 index.php
的所有内容,但在文件顶部添加以下代码。
/**
* Get the Term ID of the current term.
*/
$term = get_queried_object();
$term_id = $term->term_id;
/**
* Get all posts and pages with the current term.
*/
$args = array(
'post_type' => array('post', 'page'),
'posts_per_page' => -1,
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => [$term_id]
)
)
);
/**
* Create a new query.
*/
$query = new WP_Query($args);
然后替换所有出现以下情况的地方:
if ( have_posts() ) {
// replace with
if ( $query->have_posts() ) {
,
while ( have_posts() ) {
// replace with
while ( $query->have_posts() ) {
和
the_post();
// replace with
$query->the_post();
然后在while
循环的右括号后,添加wp_reset_postdata();
以确保与页面相关的post数据已被重置。 (否则循环中最新的 post 将被视为页面的 post)。
这应该(至少)允许您访问 post 和具有与页面对应的 post_tag
术语的页面。
向 WordPress 页面添加标签
当我在 WordPress 标签页上时,我尝试显示带有相同标签的帖子和页面。我正在使用一些自定义代码来将标签功能添加到 WordPress 页面。向页面添加标签是可行的,当我在页面模板中使用 <?php the_tags(); />
时,我也可以在页面上显示标签。
我正在使用此代码(在我的子主题 functions.php 中)将标签功能注册到页面:
// Add tag support to pages
function tags_support_all() {
register_taxonomy_for_object_type('post_tag', 'page');
}
add_action('init', 'tags_support_all');
问题 - 带有标签的页面没有显示在标签页上
我似乎找不到让这些页面显示在标签页上的方法。它只显示标有相同标签的帖子。没有页面。我使用下面的代码尝试通过将 post_type 设置为 'any' 来更新 pre_get_posts 查询。这是我在 Google 上找到的一个(旧)片段,为什么我正在寻找解决方案。我不确定这是否仍然可行,但我找不到任何可行的替代方案。
// Display all post types on tag pages
function tags_support_query($wp_query) {
if ($wp_query->get('tag')) {
$wp_query->set('post_type', 'any');
}
}
add_action('pre_get_posts', 'tags_support_query');
关于如何让它工作有什么想法吗?
一些额外信息:
- WordPress 版本 5.7.2.
- 我正在使用主题和(自定义)子主题组合。主题使用古腾堡编辑器。
- 以上代码片段添加到子主题functions.php
- 没有具体的 tag.php 或 archive.php。标签页使用默认的index.php显示标签页。这个index.php也用在类别、档案等
创建一个可用于所有标签的新文件并将其命名为 tag.php
。这将允许该文件呈现所有标签相关的存档页面。其他类别和档案将保持不变。
在这个新文件中复制 index.php
的所有内容,但在文件顶部添加以下代码。
/**
* Get the Term ID of the current term.
*/
$term = get_queried_object();
$term_id = $term->term_id;
/**
* Get all posts and pages with the current term.
*/
$args = array(
'post_type' => array('post', 'page'),
'posts_per_page' => -1,
'post_status' => 'publish',
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => [$term_id]
)
)
);
/**
* Create a new query.
*/
$query = new WP_Query($args);
然后替换所有出现以下情况的地方:
if ( have_posts() ) {
// replace with
if ( $query->have_posts() ) {
,
while ( have_posts() ) {
// replace with
while ( $query->have_posts() ) {
和
the_post();
// replace with
$query->the_post();
然后在while
循环的右括号后,添加wp_reset_postdata();
以确保与页面相关的post数据已被重置。 (否则循环中最新的 post 将被视为页面的 post)。
这应该(至少)允许您访问 post 和具有与页面对应的 post_tag
术语的页面。