- Home
- Categorie
- Coding e Sistemistica
- WordPress
- Filtro replace testo
-
Filtro replace testo
Quando inserisco un'immagine nell'articolo appare l'url completa dell'immagine, io lo voglio accorciare perché l'immagine è interna nella cartella Media.
Quindi l'ho impostato in modo che elimina la parte dell'URL, ma non funziona.function replace_text($text) { $text = str_replace('img src="miosito.it', '', $text); return $text; } add_filter('the_content', 'replace_text');
-
Ciao Apthu,
da quello che vedo in pratica stai eliminando 'img src="miosito.it' a tutto il testo, in questo modo rompi anche il o i tag img, che cosa vuoi ottenere esattamente?
-
Ho letto che togliendo l'url il caricamento è più veloce perché pesca i'immagine direttamente da Wordpress.
-
Se vuoi migliorare il caricamento delle immagini usa uno dei tanti plugin che applicano il lazyload, cambiare l'url per renderla relativa invece che assoluta è pressoché ininfluente per le performance.
Se invece vuoi farlo a scopo didattico allora ci possiamo lavorare su.
-
Ho già il plugin WP-Optimize. Comunque se mi dici così lascio l'url intero come lo mette Wordpress di default.
C'è un'altra cosa che non capisco su questo codice: l'ho messo in functions.php child e funziona, mi mette **class="links" **ma lo modifica solo nel database. Se entro nell'articolo e clicco Modifica articolo, il codice appare senza questa classe che però c'è nel database e che funziona.
Se invece nel database SQL metto il codice replace mi fa la modifica anche nel template, capisci?function replace_text($text) { $text = str_replace('<a href', '<a class="links" href', $text); return $text; } add_filter('the_content', 'replace_text');
-
@Apthu said:
>function replace_text($text) { $text = str_replace('<a href', '<a class="links" href', $text); return $text; } add_filter('the_content', 'replace_text'); >``` Questo snippet funziona solo lato front end del tuo sito perché usa l'hook 'the_content'. Se vuoi filtrare il testo al salvataggio allora l'hook da usare è differente.
-
Che hock devo usare?
-
Potresti usare 'save_post' https://developer.wordpress.org/reference/hooks/save_post/ o ancora meglio "save_post_{$post->post_type}" https://developer.wordpress.org/reference/hooks/save_post_post-post_type/
-
Li ho provati entrambi, ma non funzionano del tutto, non fanno la modifica nemmeno nel database.
-
Cosa vuol dire che non funzionano del tutto?
-
Che non lo modifica nemmeno nel database, con the_content lo modificava almeno lì anche se non si vedeva nel post. Questi 2 invece non fanno nulla.
-
Hai visto la documentazione?
Come e dove hai scritto il codice?
-
Si l'ho vista, ma non ci capisco molto. Il codice è questo in functions.php child:
function replace_text($text) { $text = str_replace('a href', 'a class="links" href', $text); return $text; } add_filter('save_post', 'replace_text');
-
Non funziona perché 'save_post' passa tre parametri di cui il primo è l'id del post, il secondo l'oggetto del post e il terzo un valore boleano che indica se stai aggiornando o salvando un nuovo contenuto, tu hai usato la tua funzione senza cambiare nulla e così non funzionerà mai, anzi, probabilmente nel log ci sono degli errori.
Add ogni modo c'è un hook che viene eseguito prima di 'save_post' che è 'wp_insert_post_data' https://codex.wordpress.org/Plugin_API/Filter_Reference/wp_insert_post_data
Se leggi bene la documentazione ti da uno snippet di esempio:
[PHP]
function filter_handler( $data , $postarr ) {
// do something with the post data
return $data;
}add_filter( 'wp_insert_post_data', 'filter_handler', '99', 2 );
[/PHP]La variabile $data è un array e per accedere al contenuto puoi usare la chiave 'post_content' in questo modo:
[PHP]
$data['post_content']
[/PHP]In questo modo puoi cambiare il contenuto dell'articolo.
-
Mi hai dato un nuovo codice? Io non so bene i termini tecnici inglesi e francamente non è che intendo fare una scuola serale per questo codice.
Non puoi darmi il codice corretto tu?
Anche così non funziona
[PHP]function replace_text($text) {
$text = str_replace('a href', 'a class="links" href', $text);
return $text;
}
add_filter('save_post', 'replace_text', 10, 3); [/PHP]
-
Il mio ultimo post è proprio il codice che ti serve, devi solo adattarlo alle tue esigenze aggiungendo per str_replace che hai nel tuo codice, ho solo sostituito l'hook con uno più adatto allo scopo, tutto il resto è invariato.
-
Bene, così funziona, salvo l'articolo e aggiorno la pagina e appare la modifica:
[PHP]function filter_handler( $data , $postarr ) {
$data = str_replace('a href', 'a class="links" href', $data);
return $data;
}
add_filter( 'wp_insert_post_data', 'filter_handler', '99', 2 ); [/PHP]Grazie.
-
La variabile $data è un array e sopra ti avevo indicato come usarla per il contenuto:
[PHP]$data['post_content'][/PHP]
-
Perché allora funziona lo stesso? Dove lo devo mettere quell'avanzo di codice, così?
function filter_handler( $data['post_content'] , $postarr ) {
$data = str_replace('a href', 'a class="links" href', $data);
return $data;
}
add_filter( 'wp_insert_post_data', 'filter_handler', '99', 2 );
-
Funziona lo stesso perché la funzione str_replace ($search, $replace, $subject, &$count = null) accetta sia stringe che array di stringhe nei suoi primi 3 parametri https://www.php.net/manual/en/function.str-replace.php e visto che $data è un array che contiene stringhe allora non da errore.
Però nel tuo caso è meglio essere più espliciti nel codice per evitare incomprensioni inserendo solo la parte che deve essere modificata e non tutto l'array così eviti anche che se un giorno tu volessi usare 'a href' nel titolo questo non venga sostituito.
Di seguito la tua funzione semplificata con solo quello che ti serve.
[PHP]
function filter_handler( array $data ) {
$data['post_content'] = str_replace('a href', 'a class="links" href', $data['post_content']);
return $data;
}
add_filter( 'wp_insert_post_data', 'filter_handler', '99' );[/PHP]