Поддержка Проблемы и решения Поиск и замена в the_content

  • Решено listblank

    (@listblank)


    Здравствуйте!
    Есть массив строк которые нужно найти и заменить совпадения в контенте
    $in=($strokes_from_loop);
    $change=($strokes_from_loop_change);

    В $strokes_from_loop находится массив значений полученных из цикла ‘Первое’, ‘Второе’

    Array
    (
        [0] => Первое
        [1] => Второе
    )

    в этом случае находится только первое совпадение в $strokes_from_loop_change

    А если же создать массив так
    $strokes_from_loop = array(‘Первое’,’Второе’);
    которая тоже выводит это

    Array
    (
        [0] => Первое
        [1] => Второе
    )

    то находятся все совпадения.
    Какого так происходит не могу понять

    • Тема изменена 3 года назад пользователем listblank.
Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Как воспроизвести проблему на чистой установке?

    Приведённых фрагментов недостаточно, чтобы понять, где и что находится и не находится.

    Автор listblank

    (@listblank)

    Есть две фукнции в 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 — все работает.

Просмотр 4 ответов — с 1 по 4 (всего 4)
  • Тема «Поиск и замена в the_content» закрыта для новых ответов.