Как воспроизвести проблему на чистой установке?
Приведённых фрагментов недостаточно, чтобы понять, где и что находится и не находится.
Есть две фукнции в functions.php
Первая:
function select_words($comment, $args, $depth) {
$GLOBALS['comment'] = $comment;
if( get_field('comment_name', $comment) ) {
$hmtl_var = get_field('comment_name', $comment);
$hmtl_find = "$hmtl_var|";
echo $hmtl_find;
}
}
Вторая;
function short_comment($comment, $args, $depth) {
$GLOBALS['comment'] = $comment;
if( get_field('comment_name', $comment) ){
$comment_select = get_field('comment_name', $comment);
$html_cod = "<span class='find_id' title='$comment->comment_content' data-id='$comment->comment_ID'>$comment_select</span>|";
echo $html_cod;
}
}
Они вызываются в следующем коде:
function replace_content($content){
$query_id = get_queried_object_id();
$comments = get_comments(array(
'status' => 'approve',
'post_id' => $query_id
));
$echo_arr = wp_list_comments(array(
'style' => '',
'callback' =>'select_words',
'echo' => false,
), $comments);
$echo_arr = explode("|", $echo_arr); // массив для поиска
$echo_arr_exit = wp_list_comments(array(
'style' => '',
'callback' =>'short_comment',
'echo' => false,
), $comments);
$echo_arr_exit = explode("|", $echo_arr_exit); // массив для замены
$content = str_ireplace($echo_arr,$echo_arr_exit,$content);
return $content;
}
add_filter('the_content','replace_content');
Почему то после выполнения этого кода изменяется только первое совпадение. Первая функция возвращает массив, если этот массив создать вручную с теми же значениями, то все выводится как надо.
Модератор
Yuri
(@yube)
Первая функция возвращает массив
select_words? Она вообще ничего не возвращает, она что-то выводит. Вторая, кстати, тоже. У обеих в конце echo
, а для возврата значения предназначен оператор return
.
И зря Вы используете str_ireplace(). Стёмная функция, лучше использовать preg_replace() с соотв. флагами.
Проблема оказалась с wp_list_comments, эта функция возвращает помимо html комментариев в коде еще и переносы строк \n — нужно было на выходе почистить.
Вместо str_ireplace воспользовался preg_replace — все работает.