Насколько постоянно изменять контент комментариев на основе $ wp_query?
Вопрос
Для плагина мне нужно создать свой собственный очень ранний контент по публикации и фильтр контента комментариев. Размещать содержимое/изменение текста работает, то есть модификации оказываются в браузере клиента. Но мои модификации контента/текста в моем комментарии каким -то образом не настойчивы, то есть клиент получает исходный текст комментариев.
Момент, когда я «зацепил», определяется 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, который вам нужно добавить. Единственная проблема с этим решением заключается в том, что размер буфера, установленного на сервере, может быть недостаточно в зависимости от того, сколько у вас контента на одной странице или насколько мал буфер.