Функция обрабатывает только последний искомый шаблон.Что случилось? - PullRequest
1 голос
/ 02 июля 2019
/**
 * Quick Links for ACF
 */
function replace_text($content) {
    $quick_links = get_field('quick_links', 'option');
    if($quick_links && is_singular('post')) {
        foreach($quick_links as $item) {
            $word = $item['word_quick_links'];
            $link = $item['link_quick_links'];
            $preg_replace = preg_replace('/\b'.preg_quote($word, '/').'\b/', '<a href="' . $link . '" target="_blank">' . $word . '</a>', $content, 1);
        }
        return $preg_replace;
    } else {
        return $content;
    }
}
add_filter('the_content', 'replace_text', 20 );

В функции preg_replace () последним аргументом является limit - максимально возможное количество замен каждого шаблона для каждой строки темы. По умолчанию оно равно -1 (без ограничений).

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

1 Ответ

0 голосов
/ 02 июля 2019

Во внутреннем цикле, который заменяет текст в содержимом, вы всегда начинаете с исходного текста ($content) и возвращаете новую строку ($preg_replace) ...

    $preg_replace = preg_replace('/\b'.preg_quote($word, '/').'\b/', '<a href="' . $link . '" target="_blank">' . $word . '</a>', $content, 1);

Вместо этого вы должны поместить результат обратно в исходное содержимое, чтобы следующий цикл добавлял к заменам, а не получал новую строку (поэтому поместите новое значение обратно в $content) ...

    $content = preg_replace('/\b'.preg_quote($word, '/').'\b/', 
        '<a href="' . $link . '" target="_blank">' . $word . '</a>',
        $content, 1);

и затем вернуть это значение (вы всегда можете вернуть $content ...

    return $content;
...