• 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.


  • Moderatore

    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 );


  • Moderatore

    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]


  • @overclokk said:

    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.

    Non ho capito questa parte: se io inserisco a href lui me lo sostituisce ne più ne meno, come fa a distinguere in che punto del sito si trova?


  • Moderatore

    Appunto, non può sapere dove lo sostituirlo se non sei più esplicito, "lo voglio sostituire solo qui".

    Un array è semplicemente un contenitore con chiavi e valori:

    [PHP]array (
    0 => 'Valore',
    1 => 'Valore',
    2 => 'Valore',
    3 => 'Valore',
    )[/PHP]

    Nell'array $data (che è un array associativo) sono contenute le informazioni del post:

    [PHP]$data[
    'post_content' = 'Lorem Ipsum',
    'post_title' = 'Titolo delpost',
    // ... ecc ecc
    ];[/PHP]

    Per avere solo e soltanto il contenuto dell'editor devi indicare la chiave che in questo caso è 'post_content', ovvero la posizione del valore che vuoi modificare:

    [PHP]$data['post_content'];[/PHP]

    Ora visto che la funzione str_replace accetta anche gli array quello che fa è cercare 'a href' in ogni settore dell'array quindi come puoi ben capire se tu per esempio hai 'a href' anche nel titolo te la sostituisce anche li, ora è una possibilità molto remota che tu inserisca 'a href' nel titolo però è importante da subito cercare di limitare il più possibile futuri bug che poi diventerebbero problematici da trovare proprio per il motivo detto sopra.

    Ad ogni modo se non ti ho convinto prova direttamente e vedi quello che succede.

    Qui c'è la spiegazione di cosa sono gli array https://www.php.net/manual/en/language.types.array.php


  • Sto provando il tuo ultimo, possono andarmi bene entrambi perché a me serve mettere quel css in tutti i link dell'articolo (non del titolo).
    Allora potrò usare questo codice temporaneamente anche per altri replace senza dover entrare nel database in SQL e mettere la classica stringa:

    [PHP]UPDATE wp_posts SET post_content = REPLACE(post_content, 'vecchio', 'nuovo');
    [/PHP]


  • Moderatore

    Non l'ho scritto prima però lo scrivo ora, prima di fare qualsiasi modifica sul database fai un backup e assicurati che sia funzionante, poi puoi fare tutte le modifiche che vuoi.


  • Il backup lo faccio di routine. I codici normalmente li provo nel sito in locale. Con mac è una menata tutte le volte, quando modifico il css devo poi sempre aggiornare Safari, mentre se modifico un altro file non serve aggiornare.

    Funziona.


  • Moderatore

    Ottimo.