Segnalare un articolo vecchio in modo automatico /2

news-of-the-world

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:

/**
 * 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.

aldolat

Il blocco note di Aldo.


Come segnalare in modo automatico che un articolo è obsoleto.