Поддержка Проблемы и решения автозамена с add_filter(), но без the_content или как?

  • Доброго времени!

    Прошу помощи в разъяснении следующего вопроса.

    Есть постоянная страница с заданным для неё шаблоном, её содержимое хранится в произвольных полях, от туда оно извлекается через задание в шаблоне примерно такого кода:

    <?php
    $cft = get_post_meta($post->ID,'label1', true);
    if($cft !== '')
      echo ('<p>'.$cft.'</p>');
    ?>

    Теперь вопрос:
    Если я хочу сделать автозамену для содержимого страницы, то не могу воспользоваться конструкцией вида:

    function replace_text($text)
    {
    $text = str_replace('zzz', 'aaa', $text);
    return $text;
    }
    add_filter('the_content', 'replace_text');

    так как содержимое страницы не хранится внутри тела цикла Loop(), как это описано в спецификации… 🙁
    Как же быть?!
    Подкиньте пожалуйста идею!

    Заранее спасибо!

Просмотр 5 ответов — с 1 по 5 (всего 5)
  • $old = get_post_meta($post->ID,'content', true);
    $new = str_replace('old', 'new', $old);
    echo $new;

    Спасибо за ответ, но либо я не понял идею, либо это немного не то.
    Поскольку данные хранятся в произвольных полях, то я понимаю как их извлечь оттуда с помощью get_post_meta(),
    (правда, не ясно что полуим по ключу 'content' — ну да это не суть)

    Но поскольку таких данных (да и страниц) много, то моя изначальная идея была не править код перед каждым извлечением данных из custom fields, а навесить некий хук, который бы исполнялся перед выводм содержимого на страницу — именно так как это ссделано в фильтрах WP (add_filter()).
    Я бы и применил его, но не позволяют конструкционные особенности.

    Вот и вопрос — где можно доходчиво прояснить для себя схему работы фильтров, можно ли их применить в данном случае и если нет, то какая есть альтренатива?

    Спасибо!

    Модератор Yuri

    (@yube)

    Зачем еще что-то своё «навешивать», когда хуков и так понатыкано почти (увы, почти) везде?

    http://codex.wordpress.org/Plugin_API/Filter_Reference
    http://codex.wordpress.org/Plugin_API/Action_Reference

    надо изменить код страницы и не напрямую печатать контент как у вас а навешать еще один фильтр на the_content только поставить его самым первым
    сначала подключаем первый фильтр

    function first_f($content){
       global $post;
       $cft = get_post_meta($post->ID,'label1', true);
       if($cft !== '')
         return ('<p>'.$cft.'</p>');
       else return $content;
    }
    add_filter('the_content', 'first_f', 1);

    а ваш фильтр подключаете вторым номером

    function replace_text($text)
    {
    $text = str_replace('zzz', 'aaa', $text);
    return $text;
    }
    add_filter('the_content', 'replace_text',2);

    ну а на странице пишем как обычно в цикле loop

    the_content();

    Спасибо, товарищ stur!
    Да, всё так и получилось, как Вы написали.
    Единственное, что при таком вариате придётся переписывать все шаблоны и также отслеживать какой шаблон в каком случае применяется (так как их много и они разные) — ну да это уже не суть вопроса, главное принципиальное решение есть!
    Ещё раз спасибо.

    Но вот советом уважаемого Ю.Б. воспользоваться не получилось…
    Что-то не понял я какой из предложенных Action Reference или Filter Reference подходит в моём случае загрузки данных из произвольных полей…
    Но всё равно спасибо — попробую разобраться.

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