Segnalare un articolo vecchio in modo automatico /2

Come segnalare in modo automatico che un articolo è obsoleto.

Vi pubblico una versione aggiornata della funzione per controllare l’età di un post e visualizzare un messaggio. Ne parlai tanti anni fa e, mentre stavo facendo ordine tra i miei script, ci ho voluto mettere mano. Da tempo ne conservo una copia su Gist, che oggi ho aggiornato.

Ecco la funzione:

<?php
/**
 * Check if a post is older than a certain date and, if so, returns a message.
 * The message can also be triggered under certain taxonomies.
 * In addition posts that have certain taxonomies could ever be excluded.
 * The message can be displayed only on single posts.
 *
 * @param array $args {
 *    The options for the function.
 *
 *    @type string           $time             The time unit where to calculate the age of the post.
 *                                             Default 'year'.
 *                                             Accepts 'month', 'week', 'day', 'hour', 'minute'.
 *    @type integer          $max_quantity     The maximum value for the age of the post.
 *    @type string           $taxonomy_include The name of the taxonomy under which the message is triggered.
 *                                             Default empty.
 *                                             Accepts any taxonomy name.
 *    @type string|int|array $term_include     The term name/term_id/slug or array of them to check for.
 *    @type string           $taxonomy_exclude The name of the taxonomy under which the message is not triggered.
 *    @type string|int|array $term_exclude     The term name/term_id/slug or array of them to check for.
 *    @type bool             $on_single_only   Whether the function should be executed only on single posts.
 *    @type string           $message          The message to be displayed.
 *                                             The string must contain '%s' in order to display the number (1 year, 5 months, ecc.).
 * }
 *
 * @example We want to display an alert message only
 *    - on technical posts that have the category 'Tech Ninja' and/or the category 'Computer Experts';
 *    - older than 6 months ago;
 *    - but we do not want the message on those posts that have the tag 'Featured' and/or the tag 'Premium Post'.
 *    - Also the message must be displayed on single posts only.
 *    In this case, here how to call the function:
 *    $args = array(
 *       'time'             => 'month',
 *       'max_quantity'     => 6,
 *	     'taxonomy_include' => 'category',
 *	     'term_include'     => array( 'Tech Ninja', 'Computer Experts' ),
 *	     'taxonomy_exclude' => 'post_tag',
 *	     'term_exclude'     => array( 'Featured', 'Premium post' ),
 *       'on_single_only'   => true,
 *       'message'          => 'This is a technical post of %s ago. Instructions could not be valid anymore.'
 *    );
 *    check_post_age( $args );
 *
 * @return string A HTML P element with a notice.
 */
function check_post_age( $args ) {
	$defaults = array(
		'time'             => 'year',
		'max_quantity'     => 1,
		'taxonomy_include' => '',
		'term_include'     => '',
		'taxonomy_exclude' => '',
		'term_exclude'     => '',
		'on_single_only'   => true,
		'message'          => __( 'This post is obsolete! It was written %s ago.', 'my-translation-domain')
	);
	$args = wp_parse_args( $args, $defaults );
	extract( $args, EXTR_SKIP );

	/*
	 * Check if on single posts we have to hide the message and make sure we are on a single post.
	 * Otherwise stop the function.
	 */
	if ( $on_single_only && ! is_single() )
		return;

	// Let's define $diff_time, the difference in seconds between today and the time of the post.
	global $post;
	$today = current_time( 'timestamp' );
	$post_time = get_the_time( 'U', $post->ID );
	$diff_time = $today - $post_time;

	// Make sure $max_quantity is a non-negative integer.
	$max_quantity = absint( $max_quantity );

	// Lets define $limit_time, the time beyond which the message is triggered.
	switch ( $time ) :
		case 'year' :
			$limit_time = YEAR_IN_SECONDS * $max_quantity;
		break;
		case 'month' :
			$limit_time = 30 * DAY_IN_SECONDS * $max_quantity;
		break;
		case 'week' :
			$limit_time = WEEK_IN_SECONDS * $max_quantity;
		break;
		case 'day' :
			$limit_time = DAY_IN_SECONDS * $max_quantity;
		break;
		case 'hour' :
			$limit_time = HOUR_IN_SECONDS * $max_quantity;
		break;
		case 'minute' :
			$limit_time = MINUTE_IN_SECONDS * $max_quantity;
		break;
	endswitch;

	$output = '';

	// Check if the age of the post is beyond the limit time.
	if ( $diff_time > $limit_time ) {
		/*
		 * Check these conditions:
		 * 		1. if $taxonomy_include is empty OR the post has the specified taxonomy
		 *		2. AND the post has not the specified taxonomy.
		 *
		 * The function empty( $taxonomy_include ) triggers the notice in case we do not specify any taxonomy,
		 * for example if we want that all posts older that the limit time should trigger the notice.
		 */
		if ( ( empty( $taxonomy_include ) || has_term( $term_include, $taxonomy_include, $post->ID ) ) && ! has_term( $term_exclude, $taxonomy_exclude, $post->ID ) ) {
			$message = sprintf( $message, human_time_diff( $post_time, $today ) );
			$output .= "\n" . '<!--googleoff: all-->' . "\n";
			$output .= '<p class="obsolete-post-warning">' . $message . '</p>' . "\n";
			$output .= '<!--googleon: all-->' . "\n\n";
		}
	}

	return $output;
}

Rispetto al post di tanti anni fa, la funzione è ora unica. Utilizzata così com’è, visualizza l’avviso su qualunque post più vecchio di un anno fa e va richiamata in questo modo:

function check_this_post_age( $content ) {
    $args = array();
    $content = check_post_age( $args ) . $content;
    return $content;
}
add_filter( 'the_content', 'check_this_post_age' );

Qualora si voglia visualizzare il messaggio solo su determinati post su cui è bene avvisare l’utente (ad esempio su post più tecnici che possano essere diventati obsoleti), questi i parametri da personalizzare:

function check_this_post_age( $content ) {
    $args = array(
        'time'             => 'year',
        'max_quantity'     => 1,
        'taxonomy_include' => 'category',
        'term_include'     => array( 'Tech Ninja', 'Wi-Fi Stereo' ),
        'taxonomy_exclude' => 'post_tag',
        'term_exclude'     => array( 'Safe Tag', 'Save my post' ),
        'on_single_only'   => true,
        'message'          => 'This is a technical post I wrote %s ago. Be careful and test everything!',
     );
    $content = check_post_age( $args ) . $content;
    return $content;
}
add_filter( 'the_content', 'check_this_post_age' );

In questo caso, l’avviso sarà mostrato se il post ha una certa età (1 anno) e se appartiene alla categoria “Tech Ninja” e/o “Wi-Fi Stereo”. Se però il post ha il tag “Safe Tag” e/o “Save my post” il messaggio non sarà visualizzato. Il messaggio, inoltre, viene visualizzato solo sul post singolo e non sulla pagina degli archivi o sulla pagina indice. Qualora lo si voglia anche in questi casi, basta dichiarare false il parametro on_single_only.

Il parametro message restituisce il messaggio, appunto, e se contiene la stringa %s essa verrà sostituita dalla quantità di tempo trascorsa.

Alcuni esempi di applicazione di questa funzione possono essere visti in questo articolo (un post tecnico, pubblicato più di un anno fa) e in quest’altro articolo (un post tecnico con un tag che evita l’apparizione del messaggio di avviso).

Un’ultima annotazione. Quel <!--googleoff: all--> e <!--googleon: all--> dice al motore di ricerca di Google di non indicizzare il blocco di testo che ci sta in mezzo, altrimenti nei risultati di ricerca si vedrà sempre il testo “Questo è un post tecnico ecc…”, laddove Google in genere mostra lo snippet del testo. Qui si trovano per maggiori informazioni.

Autore: Aldo Latino

Aldo Latino usa con entusiasmo Linux nella distribuzione Ubuntu, è un appassionato di WordPress e si diletta a fare il blogger. Ha anche una lista dei desideri. Per altre informazioni visita la sua .

Lascia un commento

Puoi usare la sintassi Markdown per formattare il commento. Per scrivere codice in linea usando due backtick così `codice` oppure codice multiriga usando tre backtick di fila (```) prima e dopo le righe di codice. Per il codice multiriga puoi anche definire il tipo, aggiungendo — subito dopo i primi tre backtick — l'acronimo css, html, php o altro.

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *