Domanda

Per un plugin, ho bisogno di costruire il mio contenuti e contenuti commento filtro molto presto dopo. contenuti Post / testo opere che cambiano, vale a dire le modifiche finiscono nel browser del client. Ma il mio commento modifiche contenuto / testo in qualche modo non sono persistenti, vale a dire il cliente riceve il testo del commento originale.

Il punto nel tempo I "agganciare" è definito dalla template_redirect gancio. Ho quindi eseguire qualcosa di simile:

global $wp_query;

// Iterate over all posts in this query.
foreach ($wp_query->posts as $post) {
    // Edit post text
    $post->post_content = "foo"; // works: ends up at the client

    // Iterate over all approved comments belonging to this post
    $comments = get_approved_comments($post->ID);
    foreach ($comments as $comment) {
        // Edit comment text
        $comment->comment_content = "bar"; // this one is lost
        } 
    }

Come indicato tramite i commenti di origine di cui sopra, $post->post_content = "foo"; ha effetto in questo contesto, ma $comment->comment_content = "bar"; non lo fa.

Per monitorare questo in giù, almeno un po 'di più, ho applicato un filtro di debug per il contenuto del post e ai contenuti commento:

add_filter('the_content', 'var_dump');
add_filter('comment_text', 'var_dump');

Dopo la routine di modifica dei contenuti di cui sopra, questi filtri stampare "pippo" in caso di contenuti post, ma il contenuto commento viene stampato invariato (il contenuto originale viene stampato).

Quindi, $comment->comment_content = "bar"; sembra essere una modifica locale, mentre $post->post_content = "foo"; funziona come desiderato:. Globalmente

O è il database anche interrogato due volte per i commenti in modo che la mia modifica in qualche modo viene sovrascritta ad un certo punto?

Ho cercato di lavorare con $wp_query->comments, anche. Ma questa variabile è NULL al momento voglio e bisogno di agganciare in.

La domanda finale e primario è:

A mio ciclo precedente, che cosa devo fare, per modificare il contenuto commento persistente?

FYI: Sto usando WordPress 3.0.1

È stato utile?

Soluzione

La funzione che include i commenti template anche (ri) carica i commenti . Questo significa che qualsiasi cosa tu faccia prima di quel punto, se non lo fai salvarlo al database non verrà utilizzato.

Non v'è alcun modo per prevenire questa query SQL accada, ma è possibile ignorare i risultati agganciando nel filtro comments_array. Vorrei salvare le modifiche in un array digitato dal commento ID, in modo da poter fare le ricerche rapide e sostituire il contenuto, se necessario.

$wpse4522_comments = array();

// Somewhere in your template_redirect (why not wp_head?) hook:
foreach ($wp_query->posts as $post) {
    // Edit post text
    $post->post_content = "foo"; // works: ends up at the client

    // Iterate over all approved comments belonging to this post
    $comments = get_approved_comments($post->ID);
    foreach ($comments as $comment) {
        // Edit comment text
        $GLOBALS['wpse4522_comments'][$comment->comment_ID] = 'bar';
    } 
}

// And this loads the content back into the array from comments_template()
add_filter( 'comments_array', 'wpse4522_set_comments_content' );
function wpse5422_set_comments_content( $comments, $post_id )
{
    global $wpse4522_comments;
    foreach ( $comments as &$comment_data ) {
        if ( array_key_exists( $comment_data->comment_ID, $wpse4522_comments ) ) {
            $comment_data->comment_content = $wpse4522_comments[$comment_data->comment_ID];
        }
    }
    return $comments;
}

Altri suggerimenti

Senza sapere molto di più su quello che stai cerchiatura a realizzare, ci sono un paio di possibili soluzioni.

Una è quella di continuare a fare quello che stai facendo attualmente, ma anche per aggiungere un filtro a 'comment_text' di modificare il commento di uscita. L'aspetto negativo di questo è che si sta interrogando i commenti più volte.

Un'altra opzione è quella di avviare un buffer di uscita su 'template_redirect' e stampare un segnaposto sul gancio 'wp_head' per segnare un punto nell'intestazione. Quindi utilizzare i filtri 'comment_text' e 'the_content' per modificare l'output e controllare qualunque marcatori che stai cercando. Poi, nel buffer di output di richiamata, lo hanno sostituire il marcatore si inserisce nell'intestazione con qualsiasi CSS è necessario aggiungere. L'unico problema con questa soluzione è che il set dimensione del buffer sul server potrebbe non essere sufficiente a seconda di quanto il contenuto che avete in una singola pagina o quanto piccolo il buffer è.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a wordpress.stackexchange
scroll top