Comment modifier le contenu de commentaires constamment en fonction de $ wp_query?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/4522

  •  16-10-2019
  •  | 
  •  

Question

Pour un plug-in, je dois construire mon propre contenu très tôt et après filtrage de contenu de commentaire. Publier du contenu / texte changeant travaux, à savoir les modifications finissent dans le navigateur du client. Mais mes modifications du contenu de commentaire / texte sont en quelque sorte pas persistant, à savoir le client reçoit le texte du commentaire d'origine.

Le point dans le temps I "crochet" est définie par le crochet template_redirect . Je puis exécuter quelque chose comme ceci:

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
        } 
    }

Comme indiqué par les commentaires de la source ci-dessus, $post->post_content = "foo"; a un effet dans ce contexte, mais $comment->comment_content = "bar"; ne fonctionne pas.

Pour ce bas au suivi moins un peu plus, j'ai appliqué un filtre de débogage au contenu poste et au contenu de commentaire:

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

Après la routine de modification du contenu ci-dessus, ces filtres imprimer « foo » en cas de contenu poste, mais le contenu de commentaire est imprimé inchangé (le contenu original est imprimé).

Par conséquent, $comment->comment_content = "bar"; semble être une modification locale, tout fonctionne $post->post_content = "foo"; comme on le souhaite. Globalement

Ou est la base de données même interrogé deux fois pour les commentaires afin que ma modification s'en quelque sorte écrasé à un moment donné?

J'ai essayé de travailler avec $wp_query->comments aussi. Mais cette variable est NULL au moment que je veux et besoin de crochet.

La dernière question principale est:

Dans ma boucle au-dessus, que dois-je faire, de modifier le contenu de commentaires persistante?

Pour votre information: J'utilise WordPress 3.0.1

Était-ce utile?

La solution

La fonction qui comprend le modèle des commentaires aussi charge les commentaires (re) . Cela signifie que quoi que vous fassiez avant ce moment-là, si vous ne le faites pas enregistrer sur la base de données ne sera pas utilisé.

Il n'y a aucun moyen d'empêcher cette requête SQL de se produire, mais vous pouvez modifier les résultats en accrochant dans le filtre à comments_array. J'enregistrer vos modifications dans un tableau calée par l'ID de commentaires, de sorte que vous pouvez faire et remplacer rapidement les recherches contenu si nécessaire.

$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;
}

Autres conseils

Sans savoir beaucoup plus sur ce que vous êtes d'accomplir des bandages, il y a quelques solutions possibles.

On est de continuer à faire ce que vous faites actuellement, mais aussi d'ajouter un filtre à « comment_text » pour modifier la sortie de commentaire. L'inconvénient avec ce que vous interrogez les commentaires plusieurs fois.

Une autre option consiste à démarrer un tampon de sortie sur « template_redirect » et imprimer un espace réservé sur le crochet pour marquer un « de wp_head » endroit dans l'en-tête. Ensuite, utilisez les filtres « comment_text » et « the_content » pour modifier la sortie et vérifier quelles qu'en soient les marqueurs que vous recherchez. Ensuite, dans le rappel de la mémoire tampon de sortie, il a remplacer ce marqueur que vous mettez dans l'en-tête avec tout ce que vous devez css ajouter. Le seul problème avec cette solution est que l'ensemble de la taille de la mémoire tampon sur le serveur peut ne pas être suffisant en fonction de la quantité de contenu que vous avez dans une seule page ou petit tampon est.

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top