Advertisement
  1. Code
  2. WordPress

Visualizzare gli Articoli Correlati di WordPress con la tassonomia e un Custom Post Type

Scroll to top
Read Time: 9 min

Italian (Italiano) translation by Cinzia Sgariglia (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

A volte volete che i post sul vostro blog compaiano su più pagine nel vostro sito WordPress che sul solo blog.

Avete già la possibilità di utilizzare gli archivi della categoria e della tassonomia, così come i tag. Ciò consente di suddividere il contenuto e aggiungere una varietà di sezioni al sito blog o di notizie.

Ma a volte potreste avere degli articoli che si riferiscono a un custom post type. Un buon esempio di questo è un negozio. I prodotti nel vostro negozio sono custom post type, e al fine di aiutarvi a vendere tali prodotti, potete scrivere degli articoli per il blog su di loro.

In questo tutorial, vi mostrerò come aggiungere un elenco di articoli rilevanti per ogni pagina di un custom post type sul vostro sito. Farò questo utilizzando una tassonomia personalizzata, in cui termini corrisponderanno ai nomi di quei prodotti per i quali volete scrivere degli articoli. Vi mostrerò come assegnare la tassonomia personalizzata sia agli articoli dei prodotti che agli articoli standard, e utilizzare tale relazione per produrre una lista di articoli nella pagina singola del prodotto.

Di cosa avete bisogno

Per seguire questo tutorial, avrete bisogno di:

  • Un'installazione di sviluppo di WordPress — non aggiungete nulla al vostro sito online fino a quando non lo farete funzioanare!
  • Un editor di codice.
  • Un tema che potete modificare direttamente o uno con un hook dopo il contenuto. Se state usando un tema di terze parti senza hook, allora avrete bisogno di creare un tema child e modificarlo.

Impostare il plugin

Iniziate creando un nuovo plugin e aggiungendogli le informazioni di intestazione:

1
<?php
2
/**

3
 * Plugin Name:    Tuts+ Add Taxonomy Archive to Custom Post Types

4
 * Plugin URI:  https://github.com/rachelmccollin/tutsplus-custom-post-type-taxonomy-archive

5
 * Description:	Uses a custom taxonomy to add relevant blog posts to custom post type pages

6
 * Version:		1.0

7
 * Author: 		Rachel McCollin

8
 * Textdomain:	tutsplus

9
 * Author URI:	https://rachelmccollin.com

10
 *

11
 */

Se non avete familiarità, date un'occhiata al nostro corso su come creare il vostro primo plugin. E sentitevi liberi di modificare il testo di intestazione sopra, sostituendolo con il vostr nome, URI, ecc.

Registrare il Post Type

Se non state lavorando con un post type che è stato registrato da un plugin esistente sul vostro sito, è necessario iniziare registrandone uno.

Facciamo questo creando una funzione e agganciandola all'hook init. Nel vostro plugin, aggiungete questo:

1
function tutsplus_register_product_post_type() {
2
    
3
	// book blurbs

4
	$labels = array( 
5
		'name'					=> 	__( 'Products' ),
6
		'singular_name' 		=>	__( 'Product' ),
7
		'add_new' 				=>	__( 'New Product' ),
8
		'add_new_item' 			=> 	__( 'Add New Product' ),
9
		'edit_item' 			=> 	__( 'Edit Product' ),
10
		'new_item' 				=> 	__( 'New Product' ),
11
		'view_item' 			=> 	__( 'View Product' ),
12
		'search_items' 			=> 	__( 'Search Products' ),
13
		'not_found' 			=>  __( 'No Products Found' ),
14
		'not_found_in_trash' 	=> 	__( 'No Products found in Trash' ),
15
	);
16
	$args = array(
17
		'labels' => $labels,
18
		'has_archive' => true,
19
		'public' => true,
20
		'hierarchical' => false,
21
		'supports' => array(
22
			'title', 
23
			'editor', 
24
			'excerpt', 
25
			'custom-fields', 
26
			'thumbnail',
27
			'page-attributes'
28
		),
29
		'rewrite'   => array( 'slug' => 'product' ),
30
31
	);
32
	register_post_type( 'tutsplus_product', $args );
33
	
34
}
35
add_action( 'init', 'tutsplus_register_product_post_type' );

Questo registra il plugin tutsplus_product. Se volete che il post type abbia un nome diverso, modificate il codice sopra.

Ora, quando visitate le pagine di admin di WordPress, vedrete il vostro post type nel menu:

The Product post type in the WordPress admin menuThe Product post type in the WordPress admin menuThe Product post type in the WordPress admin menu

Registrare la tassonomia

Il passo successivo è quello di registrare la tassonomia. Ancora una volta, create un'altra funzione nel vostro plugin:

1
function tutsplus_register_product_taxonomy() {
2
    
3
	// product taxonomy

4
	$labels = array(
5
		'name'              => __( 'Products', 'tutsplus' ),
6
		'singular_name'     => __( 'Product', 'tutsplus' ),
7
		'search_items'      => __( 'Search Products', 'tutsplus' ),
8
		'all_items'         => __( 'All Products', 'tutsplus' ),
9
		'edit_item'         => __( 'Edit Product', 'tutsplus' ),
10
		'update_item'       => __( 'Update Product', 'tutsplus' ),
11
		'add_new_item'      => __( 'Add New Product', 'tutsplus' ),
12
		'new_item_name'     => __( 'New Product Name', 'tutsplus' ),
13
		'menu_name'         => __( 'Product Taxonomy Term', 'tutsplus' ),
14
	);
15
	
16
	$args = array(
17
		'labels' => $labels,
18
		'hierarchical' => true,
19
		'sort' => true,
20
		'args' => array( 'orderby' => 'term_order' ),
21
		'rewrite' => array( 'slug' => 'book' ),
22
		'show_admin_column' => true
23
	);
24
	
25
	register_taxonomy( 'tutsplus_product_tax', array( 'tutsplus_product', 'post', 'page' ), $args);
26
		
27
}
28
add_action( 'init', 'tutsplus_register_product_taxonomy' );
29

La mia tassonomia viene chiamata tutsplus_product_tax. Ho deliberatamente incluso tax in modo che questa è la tassonomia e non il post type. Ho anche fatto la voce di menu più specifica così chiunque utilizzi questo plugin nell'admin di WordPress saprà quando sta lavorando con il post type e quando sta lavorando con la tassonomia.

Ecco l'admin di WordPress:

The list of products with taxonomy terms assigned in the WordPress adminThe list of products with taxonomy terms assigned in the WordPress adminThe list of products with taxonomy terms assigned in the WordPress admin

Potete vedere dallo screenshot che ho anche aggiunto alcuni prodotti fittizi.

Creare la Query

Ora la parte divertente . Abbiamo bisogno di scrivere una funzione che recupererà i termini della tassonomia nella nostra nuova tassonomia per un prodotto e poi produrrà una lista di articoli che hanno anche quel termine.

Per fare questo, useremo la funzione get_the_terms(). Poi creeremo un array vuoto di variabili e aggiungeremo l'abbreviazione di ciascuno dei termini recuperati in tale array. Possiamo quindi utilizzare tale array negli argomenti di WP_Query.

Iniziate aprendo una nuova funzione ed eseguendo un controllo per vedere se siamo sulla pagina di un'unico articolo del nostro custom post type. Se avete dato al vostro custom post type un nome diverso, o ne utilizzate uno registrato da un tema di terze parti, sarà necessario sostituire 'tutsplus_product' nel codice con il vostro post type.

1
function tutsplus_add_posts_to_product_pages() {
2
    
3
	// check if we're in the product post type
4
	if( is_singular( 'tutsplus_product' ) ) {	
5
    
6
    }
7
    
8
}

Recuperare l'elenco dei termini e aggiungerli a un array

All'interno della funzione (e all'interno del controllo di trovarsi su una pagina del singolo prodotto), è ora necessario recuperare un elenco di termini di tassonomia per questo post.

Aggiungete questo:

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

Ora è necessario fare un ciclo completo di tutti i termini e aggiungerli a un array di variabili. Ma volete farlo solo se la precedente funzione ha restituito un elenco di termini, quindi avvolgetelo in un controllo che $productterms è popolato:

1
if( $productterms ) {
2
    		
3
	$producttermnames[] = 0;
4
					
5
	foreach( $productterms as $productterm ) {	
6
				
7
		$producttermnames[] = $productterm->name;
8
			
9
	}
10
    
11
}

Questo recupera l'abbreviazione di ogni termine e l'aggiunge all'array $producttermnames.

Eseguire la Query

Ora abbiamo bisogno di impostare gli argomenti della query. Questo sarà all'interno del vostro controllo if( $productterms ), dal momento che non volete che questo si lanci se non ci sono tutti i termini. Aggiungete questo al vostro codice:

1
$args = array (
2
    'post_type' => 'post',
3
	'tax_query' => array(
4
		array(
5
			'taxonomy' => 'tutsplus_product_tax',
6
			'field'    => 'slug',
7
			'terms'    => $producttermnames,
8
		),
9
	),
10
);

Qui, abbiamo utilizzato l'array $producttermnames all'interno degli argomenti tax_query. Questo recupererà tutti i post con i termini che dispone anche di questo prodotto.

Adesso eseguite una query utilizzando tali argomenti:

1
if( $query->have_posts() ) { ?>
2
    
3
	<section class="product-related-posts">
4
5
	<?php echo '<h2>' . __( 'Related Posts', 'tutsplus' ) . '</h2>'; ?>
6
7
		<ul class="product-posts">
8
9
		<?php while ( $query->have_posts() ) : $query->the_post(); ?>
10
		
11
			<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
12
				
13
			<?php endwhile; ?>
14
			
15
			<?php wp_reset_postdata(); ?>
16
		
17
		</ul>
18
		
19
	</section>
20
	
21
<?php }

Questo produrrà un elemento h2 con un titolo e un elenco di link per ogni post. Se volete, potreste produrre questo in modo diverso: magari aggiungendo l'estratto o l'immagine di presentazione.

Evitare errori

Normalmente, non vi aspettereste che un utente aggiunga più di un termine della tassonomia per ogni prodotto, perché i termini sono ognuno relativo a un prodotto. Ma è impossibile dire con certezza che questo non accada mai. Ecco perché la funzione include questo array $producttermslist e lo utilizza per un'istanza di WP_Query, invece di eseguire WP_Query in un ciclo foreach. Inoltre produce una pagina più efficiente poiché sta solo eseguendo una query supplementare.

La funzione completa

Ecco la funzione integrale, con tutte le parentesi graffe nel posto giusto:

1
function tutsplus_add_posts_to_product_pages() {
2
    
3
	// check if we're in the product post type

4
	if( is_singular( 'tutsplus_product' ) ) {		
5
		
6
		// fetch taxonomy terms for current product

7
		$productterms = get_the_terms( get_the_ID(), 'tutsplus_product_tax'  );
8
		
9
		if( $productterms ) {
10
			
11
			$producttermnames[] = 0;
12
					
13
			foreach( $productterms as $productterm ) {	
14
				
15
				$producttermnames[] = $productterm->name;
16
			
17
			}
18
			
19
						
20
			// set up the query arguments

21
			$args = array (
22
				'post_type' => 'post',
23
				'tax_query' => array(
24
					array(
25
						'taxonomy' => 'tutsplus_product_tax',
26
						'field'    => 'slug',
27
						'terms'    => $producttermnames,
28
					),
29
				),
30
			);
31
			
32
			// run the query

33
			$query = new WP_Query( $args );	
34
35
			if( $query->have_posts() ) { ?>
36
				
37
				<section class="product-related-posts">
38
			
39
				<?php echo '<h2>' . __( 'Related Posts', 'tutsplus' ) . '</h2>'; ?>
40
			
41
					<ul class="product-posts">
42
			
43
					<?php while ( $query->have_posts() ) : $query->the_post(); ?>
44
					
45
						<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
46
							
47
						<?php endwhile; ?>
48
						
49
						<?php wp_reset_postdata(); ?>
50
					
51
					</ul>
52
					
53
				</section>
54
				
55
			<?php }
56
			
57
		
58
		}
59
		
60
	}
61
62
}

Eseguire la funzione

Proprio ora, questa funzione non farà nulla. Per lanciarla, è necessario eseguire una di queste tre cose:

  1. Agganciatela a un hook di azione esistente nel vostro tema.
  2. Aggiungete un hook di azione al vostro tema utilizzando do_action() e associatelo a quello.
  3. Aggiungete il nome della funzione nel posto del vostro tema dove volete che l'elenco si produca.

Per la seconda e la terza opzione, se state lavorando con un tema di terze parti, dovreste creare un tema child e modificarlo. Potreste creare un file template single-tutsplus_product.php e aggiungergli l'hook o la funzione o semplicemente aggiungerlo a single.php. Se lo avete collegato al file di template per il post type,  potreste rimuovere il controllo if ( is_singular( 'tutsplus_product' ) ).

Nel mio caso, sto usando il tema Suki dalla directory dei plugin di WordPress. Questo include questo hook nel file single.php:

1
do_action( 'suki/frontend/after_main' );

L'hook è proprio sotto il contenuto, esattamente dove voglio che la mia lista sia prodotta. Così aggancerò la mia funzione all'hook di azione:

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

Una volta che avete fatto, salvate il vostro plugin e aggiungete alcuni prodotti e i termini della tassonomia.

Il risultato

Ho aggiunto il termine widget al mio prodotto Widget, ma ho anche aggiunto un altro termine per illustrarlo:

The products in the WordPress adminThe products in the WordPress adminThe products in the WordPress admin

Ho aggiunto questi due termini a un numero di post nel mio sito, e quando visualizzate la pagina del prodotto per un Widget, potete vedere la lista dei post correlati sotto, da entrambi i termini:

The repeated posts list on a product pageThe repeated posts list on a product pageThe repeated posts list on a product page

Questo elenco di post aiuterà i visitatori del sito ad accedere ai post del blog relativi a tale prodotto e li incoraggerà a saperne di più e (speriamo) ad acquistare.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.