Насколько постоянно изменять контент комментариев на основе $ wp_query?

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

  •  16-10-2019
  •  | 
  •  

Вопрос

Для плагина мне нужно создать свой собственный очень ранний контент по публикации и фильтр контента комментариев. Размещать содержимое/изменение текста работает, то есть модификации оказываются в браузере клиента. Но мои модификации контента/текста в моем комментарии каким -то образом не настойчивы, то есть клиент получает исходный текст комментариев.

Момент, когда я «зацепил», определяется Template_redirect крюк. Затем я выполняю что -то вроде этого:

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

Как указано в комментариях к источникам выше, $post->post_content = "foo"; влияет в этом контексте, но $comment->comment_content = "bar"; не.

Чтобы отследить это, по крайней мере, немного больше, я применил фильтр отладки к контенту POST и к контенту комментариев:

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

После подпрограммы модификации контента эти фильтры печатают «Foo» в случае пост -контента, но содержимое комментария печатается без изменений (исходный контент печатается).

Следовательно, $comment->comment_content = "bar"; кажется, локальная модификация, в то время как $post->post_content = "foo"; Работает по желанию: глобально.

Или база данных даже два раза запрашивается для комментариев, чтобы моя модификация каким -то образом перезаписывалась в какой -то момент?

Я пытался работать с $wp_query->comments, слишком. Но эта переменная NULL В тот момент, когда я хочу, и мне нужно зацепить.

Последний и основной вопрос:

В моей цикле выше, что мне нужно сделать, чтобы постоянно изменить контент комментариев?

К вашему сведению: я использую WordPress 3.0.1

Это было полезно?

Решение

Функция, которая включает шаблон комментариев также (re) загружает комментарии. Анкет Это означает, что все, что вы делаете до этого момента, если вы не сохраняете его в базе данных, это не будет использоваться.

Невозможно предотвратить этот SQL -запрос, но вы можете переопределить результаты, зацепившись в comments_array фильтр. Я бы сохранил ваши модификации в массивах, представленном идентификатором комментариев, чтобы вы могли сделать быстрый поиск и заменить содержимое, если это необходимо.

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

Другие советы

Не зная гораздо больше о том, что вы для достижения, есть несколько возможных решений.

Одним из них является продолжение делать то, с чем вы сейчас делаете, но также добавить фильтр в «Комментарий_т», чтобы изменить результат комментариев. Недостатком этого является то, что вы запрашиваете комментарии несколько раз.

Другой вариант - запустить выходной буфер на «Template_redirect» и распечатать заполнителя на крючке «wp_head», чтобы отметить место в заголовке. Затем используйте фильтры «Comment_text» и «The_content», чтобы изменить вывод и проверьте любые маркеры, которые вы ищете. Затем, в вызовом вывода буфера, пусть он заменит тот маркер, который вы вкладываете в заголовок любым CSS, который вам нужно добавить. Единственная проблема с этим решением заключается в том, что размер буфера, установленного на сервере, может быть недостаточно в зависимости от того, сколько у вас контента на одной странице или насколько мал буфер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с wordpress.stackexchange
scroll top