Come usare i filtri in WordPress (funzioni aggiuntive senza installare plugin)

Argomenti: ,
Pubblicato il: 22-06-2021 15:29 , Ultimo aggiornamento: 22-06-2021 15:27

WordPress offre varie opportunità di personalizzazione, e – forse troppo spesso – la questione viene ricondotta, per pigrizia o convenienza, ad “installare plugin“. È comodo e sbrigativo installare plugin, senza dubbio, e spesso lo si fa per questioni di budget ridicoli allocati con aspettative gigantesche, o per altrettanto rispettabili motivi. Il rischio in questi casi, pero’, è quello di ritrovarsi con siti di 5 pagine e 500 plugin installati, cosa mal dimensionata e che tende a rallentare WP (perchè si lavora molto sulla tabella wp_options che viene richiamata ad ogni aggiornamento delle pagine web) – quando esiste un’ottima alternativa, ovvero l’uso dei filtri di WP.

Avviso – Prima di procedere con le modifiche, consigliamo di agire sempre su un sito in sviluppo, perchè gli errori sono dietro l’angolo e si rischia di compromettere il funzionamento del sito. Per usare bene gli esempi, è bene sapere cos’è un loop di WordPress e naturalmente un minimo di sintassi PHP.

Cosa sono i filtri di WP

Si tratta di funzioni di sistema che si possono richiamare per assolvere a compiti non standard, per così dire. Ad esempio, se volessimo inserire un’annuncio pubblicitario dentro un articolo senza usare plugin dovremmo, in teoria, percorrere una delle due strade:

SMSHosting Codice PROMO: PRT96919 Servizio di SMS Marketing - Per inviare SMS promozionali a basso costo Scopri il servizio
  • modificare tutti gli articoli a mano, uno per uno, aggiungendo lo snippet in questione;
  • usare una funzione filtro che permetta di inserire automaticamente su qualsiasi pagina di tipo post singolo un contenuto HTML a nostra scelta.

Molte delle funzioni mostrare si basano esattamente su vari filtri di WordPress, che (come abbiamo visto) sono funzioni atte a modificare il comportamento del sito nella direzione desiderata. I In genere le funzioni indicate vanno inserite

SMSHosting Codice PROMO: PRT96919 Servizio di SMS Marketing - Per inviare SMS promozionali a basso costo Scopri il servizio
  1. in un plugin personalizzato da abilitare nel sito, oppure
  2. nel file functions.php del theme child che state usando.

Funzioni frontend

Modificare la lunghezza degli excerpt

Gli excerpt sono i testi di anteprima che vengono estrapolati in automatico nel loop standard di WordPress, e che corrispondono con il testo dell’articolo che solitamente è seguito da tre puntini (…) all’interno delle pagine dei blog che mostrano l’elenco degli articoli. Modificare la lunghezza dell’excerpt è un buon modo per entrare nell’ottica dei filtri, che sono la funzione standard di WordPress per modificare il modo in cui il CMS genera l’HTML.

SMSHosting Usa il codice PROMO per uno sconto sul primo acquisto: PRT96919

Per cambiare la lunghezza dell’excerpt in WordPress, basta creare un filtro che restituisca la lunghezza che vogliamo (espressa in massimo numero di parole, non caratteri; di default è 55):

add_filter('excerpt_length', 'my_excerpt_length');
function my_excerpt_length($len) { return 75; }

La funzione my_excerpt_length() è detta tecnicamente , in questo caso, funzione di callback: queste funzioni sono alla base delle personalizzazioni al sito effettuate a regola d’arte, in genere.

Visualizzare le date nel formato “X giorni fa

Sempre a proposito del loop, possiamo cambiare – con una logica ed una funzione analoga – il formato delle date visualizzate nel nostro sito. In questo caso il filtro può essere agevolmente inserito in un plugin, dato che permette di cambiare la visualizzazione delle date, sovrascrivendo il comportamento standard di WP, inserendo tre filtri esterni e senza modificare il theme child. La funzione di callback viene richiamata, similmente alle funzioni AJAX di Javascript, mediante una stringa con il nome della funzione come secondo argomento di add_filter:

add_filter( 'get_the_date', 'date_to_time_ago', 10, 1 ); 
add_filter( 'the_date', 'date_to_time_ago', 10, 1 ); 
add_filter( 'get_the_time', 'date_to_time_ago', 10, 1 ); 
add_filter( 'the_time', 'date_to_time_ago', 10, 1 ); 

/* funzione unica di callback */
function date_to_time_ago( $orig_time ) {
global $post;
$orig_time = strtotime( $post->post_date ); //prendi la data di default
return human_time_diff( $orig_time, current_time( 'timestamp' ) ).' '.__( 'ago' );
//restituisci il nuovo formato convertito
}
La funzionalità sfrutta human_time_diff come funzione interna core, che mostra la data in formato “1 hour”, “5 mins”, “2 days”, ovviamente con supporto incluso alla localizzazione nella lingua del sito (dovrebbe tradurre in automatico).

Abilitare la ricerca nel sito solo sui titoli dei post/pagine

Sebbene questa funzione porti ad un effetto collaterale non da poco (tende infatti ad aumentare la precisione della ricerca (precision) a discapito della sua recall (il richiamo, per dirla in modo semplice la “copertura” dei risultati), è molto utilizzata per alcune tipologie di siti come, ad esempio, quelli di annunci.

function __search_by_title_only( $search, &$wp_query ){
if ( empty($search) )
return $search; // skip processing - no search term in query
$q =& $wp_query->query_vars;

$n = !empty($q['exact']) ? '' : '%';
$searchand = '';
foreach( (array) $q['search_terms'] as $term ) {
$term = esc_sql( like_escape( $term ) );
$search .= "{$searchand}($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
$searchand = ' AND ';
}
$term = esc_sql( like_escape( $q['s'] ) );
if ( empty($q['sentence']) && count($q['search_terms']) > 1 && $q['search_terms'][0] != $q['s'] )
$search .= " OR ($wpdb->posts.post_title LIKE '{$n}{$term}{$n}')";
if ( !empty($search) ) {
$search = " AND ({$search}) ";
if ( !is_user_logged_in() )
$search .= " AND ($wpdb->posts.post_password = '') ";
}
return $search;
}
add_filter( 'posts_search', '__search_by_title_only', 10, 2 );

In questo caso il filtro è un pochino più complicato come codice, ma in genere può essere utilizzato nella forma riportata e, fatta eccezione per i casi in cui non si può usare di cui sopra, solitamente abilita questo effetto senza dover usare alcun plugin (che poi, alla fine, come abbiamo visto in passato, tende ad appesantire il sito un po’ per volta).

Escludere dei post specifici dal feed RSS standard

Questo esempio richiede l’uso del database e delle funzioni di MySQL, che qui vengono richiamate come usualmente si fa con il filtro posts_where: uno dei filtri più complicati, senza dubbio, ma anche più potenti usati da WP. La forma non deve confondere: il filtro aggiunge, nella quintultima riga, una condizione alla WHERE della query MySQL, che è obbligata a prendere solo i post che non siano con ID 1,2,3,4 (l’esempio è un template da modificare all’occorrenza):

function feed_post_exclude($where, $wp_query = NULL) {
global $wpdb;
if ( !$wp_query )
global $wp_query;
if ($wp_query->is_feed) {
// exclude post with id 40 and 9
$where .= " AND $wpdb->posts.ID NOT IN (1,2,3,4)";
}
return $where;
}
add_filter( 'posts_where','feed_post_exclude', 1, 2 );

Se la ricerca interna restituisce un solo risultato, mostra direttamente l’articolo trovato

Anche qui abbiamo una finezza, in effetti: fermo restando che le pagine dei risultati di ricerca sono quasi sempre in noindex rispetto ai motori di ricerca, così come potrebbero essere indicizzate e, in alcuni casi molto specifici, addirittura posizionarsi su Google, agire su questo filtro (template_redirect che, di fatto, vincola il comportamente di WP in fase di rendering della pagina rispetto al theme usato) significa, di fatto, migliorare la fruibilità del sito, riducendo di un click i passaggi necessari per arrivare dove l’utente desidera. Il filtro in questo caso è un esempio di uso del template_redirect:

add_action('template_redirect', 'single_result124');
function single_result124() {
if (is_search()) { //se si tratta di una pagina di ricerca
global $wp_query;
if ($wp_query->post_count == 1) {
wp_redirect( get_permalink( $wp_query->posts['0']->ID ) ); //redirect 301 all'articolo
}}}

Generare le meta description dinamicamente dal contenuto dell’articolo

Altra funzione estremamente interessante che pero’, come sempre, va saputa usare: su alcuni theme potrebbe non funzionare, perchè è indispensabile che nel file header.php del theme usato ci sia un richiamo alla funzione wp_head(), che qui viene modificata per indurre il “comportamento SEO” che ci interessa ottenere. Diversamente, infatti, il filtro sarà ignorato.

function custom_dynamic_metadesc() {
global $post;
if (!is_single()) { return; }
$meta = strip_tags($post->post_content);
$meta = strip_shortcodes($post->post_content);
$meta = str_replace(array("\n", "\r", "\t"), ' ', $meta);
$meta = substr($meta, 0, 125);
echo $meta;
}
add_action('wp_head', 'custom_dynamic_metadesc');

Inutile sottolineare che, in concomitanza di plugin SEO, questa funzione potrebbe creare potenziali conflitti.

Sostituire una parola con un’altra, all’interno del testo

Anche in questo caso i filtri sfoggiano una certa potenza di fondo, ed anche qui abbiamo una funzione da usare con cura: permette infatti di sostituire le occorrenze di testo, ad esempio della parola “casa”, con la parola “abitazione”, senza che sia necessario andare a modificare la parola stessa ogni volta all’interno del testo. Tecnologia buona o cattiva, in questo caso: potrebbe essere usata (con un po’ di ingegno) per inserire in automatico link affiliati nel testo, ad esempio, oppure può “censurare” determinate parole per impedire che appaiono all’interno del sito. Il core della funzione è la potentissima funzione str_replace di PHP, che effettua le sostituzioni indicate nell’array $replace sui filtri the_content e the_excerpt (le funzioni rispettivamente per mostrare testo dell’articolo e anteprima nel loop).

function replace_text_trv($text){
$replace = array(
'casa' => 'abitazione',
...
);
$text = str_replace(array_keys($replace), $replace, $text);
return $text;
}

add_filter('the_content', 'replace_text_trv');
add_filter('the_excerpt', 'replace_text_trv');

Aggiungere la parola “leggi tutto” ad un excerpt

Ennesimo caso di hook o filtro che serve a “mettere una patch” qualora il theme non risponda pienamente alle nostre esigenze: in questo caso, aggiungeremo la stringa cliccabile “leggi tutto” dentro al loop standard di WP.

function excerpt_leggitutto($more) {
return '<a href="'. get_permalink($post->ID) . '"> Leggi tutto ... </a>';
}
add_filter('excerpt_more', 'excerpt_leggitutto');

Ovviamente, come sempre, quanto si fa con i filtri WP viene esteso automaticamente a tutte le pagine del sito dove quella funzione (excerpt) viene utilizzata.

Funzioni Back End

Il backend di WordPress è una  macchina complessa e, quel che è peggio, è spesso documentata in modo blando o del tutto assente. Questo rende sconveniente o poco pratico, purtroppo, effettuare modifiche di certe tipologie. Di seguito mostrerò solo filtri per il backend che siano più o meno consolidati nell’uso, fermo restando che possono non funzionare o creare potenziali conflitti o malfunzionamenti in alcuni siti.

Abilitare l’editor all’uso di più tag HTML

Molti tag HTML nell’editor standard di WP sono disabilitati per motivi di praticità, adesioni agli standard o sicurezza; fermo restando che non è sempre saggio abilitarne altri, si può pensare di usare un hook per il backend del sito che permetta alle persone di fare uso di questa feature.

I tag abilitati sono in questo caso quelle indicati nell’array $extended:

function cambia_editor_mce($initArray) {
$extended = 'pre[id|name|class|style],iframe[align|longdesc|name|width|height|frameborder|scrolling|marginheight|marginwidth|src]';
if ( isset( $initArray['extended_valid_elements'] ) ) {
$initArray['extended_valid_elements'] .= ',' . $extended;
} else {
$initArray['extended_valid_elements'] = $extended;
}

$initArray['verify_html'] = false; //opzionale
return $initArray;
}
add_filter('tiny_mce_before_init', 'cambia_editor_mce');

Cambiare l’editor di default

In questo caso basta aggiungere nella nostra personalizzazione:

//visual editor di default, tinymce
add_filter( 'wp_default_editor', create_function('', 'return "tinymce";') );

oppure:

//visual editor di default, html puro
add_filter( 'wp_default_editor', create_function('', 'return "html";') );

Per togliere Gutemberg e rimettere l’editor classico pre WordPress 5.x, c’è pure un plugin consigliato, in questo caso.

Consentire il caricamento di più tipi di file

Per motivi di sicurezza WordPress ammette solo alcuni formati di file, escludendo quelli che possono contribuire a diffondere virus o malware. Se volete aggirare questa limitazione, fermo restando che va fatto solo se strettamente necessario, potete aggiungerli editandoli dalla lista di seguito riportata.

add_filter('upload_mimes', 'changeUploadFiles');
function changeUploadFiles( $mimes ) {
$mimes['svgz'] = 'application/x-gzip';
return $mimes;
}

oppure, in alternativa la seguente funzione serve a consentire il caricamento di file di testo in formato JSON:

add_filter('upload_mimes',function( $types ) {
   return array_merge( $types, array( 'json' => 'text/plain' ) );
});

I vari tipi MIME si possono rintracciare qui.

Messaggi personalizzati nel backend

Altra funzione estremamente richiesta è quella dei messaggi personalizzati via notifiche di sistema di WP, visibili solo ad alcuni autori o a tutti. L’hook che ci interessa, in questo caso, è il seguente:

function notifica_backend_personalizzata() { ?>
<div class="error notice">
<p>
<?php _e( 'Ehi, questo è un avviso da personalizzare', 'my_plugin_textdomain' ); ?>
</p>
</div>
<?php}
add_action( 'admin_notices', 'notifica_backend_personalizzata' );

Limitare la lunghezza dei titoli degli articoli

function setMaxWords($title){
global $post; $numero_parole = 10; //massimo numero di parole
$title = $post->post_title;
if (str_word_count($title) >= $numero_parole )
wp_die( __('Uè, devi scrivere un titolo di massimo '.$numero_parole) );
}
add_action('publish_post', 'setMaxWords');

Aggiungere campi personalizzati all’editor

add_action('publish_page', 'add_custom_field');
add_action('publish_post', 'add_custom_field');

function add_custom_field($post_ID) {
global $wpdb;
if(!wp_is_post_revision($post_ID)) {
add_post_meta($post_ID, 'field-name', 'custom value', true);
}
}
5/5 (1)

Che te ne pare?

Grazie per aver letto Come usare i filtri in WordPress (funzioni aggiuntive senza installare plugin) di Salvatore Capolupo su Trovalost.it
Come usare i filtri in WordPress (funzioni aggiuntive senza installare plugin) (Guide, Guide per la configurazione di WordPress, Zona Marketing)

Articoli più letti su questi argomenti:
Trovalost.it è gestito, mantenuto, ideato e (in gran parte) scritto da Salvatore Capolupo