欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

显示带有分类法和自定义帖子类型的WordPress相关帖子

程序员文章站 2022-04-17 16:58:08
...
显示带有分类法和自定义帖子类型的WordPress相关帖子
您将要创造的

有时,您希望博客文章出现在WordPress网站中的页面上,而不只是博客。

您已经可以选择使用类别和分类档案以及标签。 这可以帮助您划分内容,并在博客或新闻站点中添加各种部分。

但是有时您可能会遇到与自定义帖子类型相关的帖子。 商店就是一个很好的例子。 商店中的产品是自定义帖子类型,为了帮助您销售这些产品,您可以撰写有关它们的博客文章。

在本教程中,我将向您展示如何在每个页面上为网站中的自定义帖子类型添加相关帖子列表。 我将使用自定义分类法进行此操作,其术语将与您要为其撰写文章的那些产品的名称相对应。 我将向您展示如何为产品和标准帖子分配自定义分类法,并使用该关系在该产品的单个页面上输出帖子列表。

您需要什么

要遵循本教程,您需要:

  • WordPress的开发安装-在正常工作之前,请勿将任何东西添加到您的实时网站中!
  • 代码编辑器。
  • 您可以直接编辑主题,也可以在内容后使用动作挂钩对其进行编辑。 如果您使用的是不带钩子的第三方主题,则需要创建一个子主题并对其进行编辑。

设置插件

首先创建一个新插件并向其中添加标题信息:

<?php
/**
 * Plugin Name:    Tuts+ Add Taxonomy Archive to Custom Post Types
 * Plugin URI:	https://github.com/rachelmccollin/tutsplus-custom-post-type-taxonomy-archive
 * Description:	Uses a custom taxonomy to add relevant blog posts to custom post type pages
 * Version:		1.0
 * Author: 		Rachel McCollin
 * Textdomain:	tutsplus
 * Author URI:	https://rachelmccollin.com
 *
 */

如果您不熟悉此方法,请查看我们有关创建第一个插件的课程。 并随意编辑上面的标题文本,替换您自己的名称,URI等。

注册帖子类型

如果您不使用站点中现有插件已注册的帖子类型,则需要先注册一个。

我们通过创建一个函数并将其挂钩到init钩子上来实现。 在您的插件中,添加以下内容:

function tutsplus_register_product_post_type() {
    
	// book blurbs
	$labels = array( 
		'name'					=> 	__( 'Products' ),
		'singular_name' 		=>	__( 'Product' ),
		'add_new' 				=>	__( 'New Product' ),
		'add_new_item' 			=> 	__( 'Add New Product' ),
		'edit_item' 			=> 	__( 'Edit Product' ),
		'new_item' 				=> 	__( 'New Product' ),
		'view_item' 			=> 	__( 'View Product' ),
		'search_items' 			=> 	__( 'Search Products' ),
		'not_found' 			=>  __( 'No Products Found' ),
		'not_found_in_trash' 	=> 	__( 'No Products found in Trash' ),
	);
	$args = array(
		'labels' => $labels,
		'has_archive' => true,
		'public' => true,
		'hierarchical' => false,
		'supports' => array(
			'title', 
			'editor', 
			'excerpt', 
			'custom-fields', 
			'thumbnail',
			'page-attributes'
		),
		'rewrite'   => array( 'slug' => 'product' ),

	);
	register_post_type( 'tutsplus_product', $args );
	
}
add_action( 'init', 'tutsplus_register_product_post_type' );

这将注册tutsplus_product插件。 如果您希望帖子类型使用其他名称,请编辑上面的代码。

现在,当您访问WordPress管理页面时,您会在菜单中看到您的帖子类型:

显示带有分类法和自定义帖子类型的WordPress相关帖子

注册分类法

下一步是注册分类法。 同样,在您的插件中创建另一个函数:

function tutsplus_register_product_taxonomy() {
    
	// product taxonomy
	$labels = array(
		'name'              => __( 'Products', 'tutsplus' ),
		'singular_name'     => __( 'Product', 'tutsplus' ),
		'search_items'      => __( 'Search Products', 'tutsplus' ),
		'all_items'         => __( 'All Products', 'tutsplus' ),
		'edit_item'         => __( 'Edit Product', 'tutsplus' ),
		'update_item'       => __( 'Update Product', 'tutsplus' ),
		'add_new_item'      => __( 'Add New Product', 'tutsplus' ),
		'new_item_name'     => __( 'New Product Name', 'tutsplus' ),
		'menu_name'         => __( 'Product Taxonomy Term', 'tutsplus' ),
	);
	
	$args = array(
		'labels' => $labels,
		'hierarchical' => true,
		'sort' => true,
		'args' => array( 'orderby' => 'term_order' ),
		'rewrite' => array( 'slug' => 'book' ),
		'show_admin_column' => true
	);
	
	register_taxonomy( 'tutsplus_product_tax', array( 'tutsplus_product', 'post', 'page' ), $args);
		
}
add_action( 'init', 'tutsplus_register_product_taxonomy' );

我的分类法称为tutsplus_product_tax 我故意包括tax所以我知道这是分类法而不是职位类型。 我还使菜单项更加具体,因此在WordPress管理员中使用此插件的任何人都将知道他们何时使用帖子类型以及何时使用分类法。

这是在WordPress管理员中:

显示带有分类法和自定义帖子类型的WordPress相关帖子

从屏幕截图中可以看到,我还添加了一些虚拟产品。

创建查询

现在是有趣的部分。 我们需要编写一个函数,该函数将在产品的新分类法中获取分类法术语,然后输出也包含该术语的帖子列表。

为此,我们将使用get_the_terms()函数。 然后,我们将创建一个空变量数组,并将提取的每个术语的标签添加到该数组中。 然后,我们可以在WP_Query的参数中使用该数组。

首先打开一个新功能,然后运行检查以查看我们是否在单个帖子页面上显示我们的自定义帖子类型。 如果您给自定义帖子类型指定了其他名称,或者您使用的是第三方主题注册的名称,则必须用自己的帖子类型替换代码中的'tutsplus_product'

function tutsplus_add_posts_to_product_pages() {
    
	// check if we're in the product post type
	if( is_singular( 'tutsplus_product' ) ) {	
    
    }
    
}

获取术语列表并将其添加到数组中

现在,在您的函数内部(以及在单个产品页面上的检查)中,您需要获取此帖子的分类术语列表。

添加此:

$productterms = get_the_terms( get_the_ID(), 'tutsplus_product_tax'  );

现在,您需要遍历所有术语并将它们添加到变量数组中。 但是,仅在前一个函数返回了术语列表的情况下,您才想这样做,因此请包装好$productterms的检查内容:

if( $productterms ) {
    		
	$producttermnames[] = 0;
					
	foreach( $productterms as $productterm ) {	
				
		$producttermnames[] = $productterm->name;
			
	}
    
}

这将获取每个词条,并将其添加到$producttermnames数组中。

运行查询

现在我们需要设置查询参数。 这将在if( $productterms )检查中进行,因为如果没有任何条件,您不希望此命令运行。 将此添加到您的代码:

$args = array (
    'post_type' => 'post',
	'tax_query' => array(
		array(
			'taxonomy' => 'tutsplus_product_tax',
			'field'    => 'slug',
			'terms'    => $producttermnames,
		),
	),
);

在这里,我们在tax_query参数中使用了$producttermnames数组。 这将获取该产品也具有任何条款的任何帖子。

现在使用这些参数运行查询:

if( $query->have_posts() ) { ?>
    
	<section class="product-related-posts">

	<?php echo '<h2>' . __( 'Related Posts', 'tutsplus' ) . '</h2>'; ?>

		<ul class="product-posts">

		<?php while ( $query->have_posts() ) : $query->the_post(); ?>
		
			<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
				
			<?php endwhile; ?>
			
			<?php wp_reset_postdata(); ?>
		
		</ul>
		
	</section>
	
<?php }

这将输出一个带标题的h2元素,以及一个链接到每个帖子的列表。 如果需要,可以以不同的方式输出:也许通过添加摘录或特色图片。

避免错误

通常,您不会期望用户为每个产品添加一个以上的分类术语,因为每个术语都与一个产品相关。 但是不可能肯定地说这永远不会发生。 这就是为什么函数包含该$producttermslist数组并将其用于WP_Query一个实例,而不是在foreach循环中运行WP_Query 由于它仅运行一个额外的查询,因此它还可以使页面更高效。

全功能

这是完整的功能,所有括号都在正确的位置:

function tutsplus_add_posts_to_product_pages() {
    
	// check if we're in the product post type
	if( is_singular( 'tutsplus_product' ) ) {		
		
		// fetch taxonomy terms for current product
		$productterms = get_the_terms( get_the_ID(), 'tutsplus_product_tax'  );
		
		if( $productterms ) {
			
			$producttermnames[] = 0;
					
			foreach( $productterms as $productterm ) {	
				
				$producttermnames[] = $productterm->name;
			
			}
			
						
			// set up the query arguments
			$args = array (
				'post_type' => 'post',
				'tax_query' => array(
					array(
						'taxonomy' => 'tutsplus_product_tax',
						'field'    => 'slug',
						'terms'    => $producttermnames,
					),
				),
			);
			
			// run the query
			$query = new WP_Query( $args );	

			if( $query->have_posts() ) { ?>
				
				<section class="product-related-posts">
			
				<?php echo '<h2>' . __( 'Related Posts', 'tutsplus' ) . '</h2>'; ?>
			
					<ul class="product-posts">
			
					<?php while ( $query->have_posts() ) : $query->the_post(); ?>
					
						<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
							
						<?php endwhile; ?>
						
						<?php wp_reset_postdata(); ?>
					
					</ul>
					
				</section>
				
			<?php }
			
		
		}
		
	}

}

运行功能

目前,此功能将无法执行任何操作。 要使其启动,您需要做以下三件事之一:

  1. 将其挂钩到主题中现有的动作挂钩。
  2. 使用do_action()将动作挂钩添加到您的主题并将其挂钩。
  3. 将函数名称添加到主题中要输出列表的位置。

对于第二个和第三个选项,如果您使用的是第三方主题,则应创建一个子主题并进行编辑。 您可以创建一个single-tutsplus_product.php模板文件并将其添加到该钩子或函数中,或者直接将其添加到single.php中 如果将其挂接到帖子类型的模板文件中,则可以删除if ( is_singular( 'tutsplus_product' ) )检查。

就我而言,我使用的是WordPress插件目录中的Suki主题。 它在single.php文件中包含此钩子:

do_action( 'suki/frontend/after_main' );

该钩子位于内容的正下方,正是我要输出列表的位置。 因此,我将把函数挂钩到该动作挂钩:

add_action( 'suki/frontend/after_main', 'tutsplus_add_posts_to_product_pages' );

完成此操作后,保存您的插件并添加一些产品和分类术语。

结果

我已经将窗口小部件术语添加到我的窗口 小部件产品中,但是我还添加了另一个术语来演示这一点:

显示带有分类法和自定义帖子类型的WordPress相关帖子

我已经将这两个术语添加到站点中的许多帖子中,当您查看Widget的产品页面时,可以从以下两个术语中看到下面的相关帖子列表:

显示带有分类法和自定义帖子类型的WordPress相关帖子

此帖子列表将帮助站点访问者访问与该产品有关的博客帖子,并鼓励他们找到有关该产品的更多信息(并希望)进行购买。

翻译自: https://code.tutsplus.com/tutorials/show-wordpress-related-posts-with-taxonomy-and-a-custom-post-type--cms-32303