Для того чтобы вывести шорткод, или изменить переменную через хук-фильтр, нужно использовать метод return;

И засада в том что если мы использовали HTML, echo или подгрузку шаблона в WP, то через return так просто их не вернуть. Текст будет вылазить не там где надо.

Также этот метод хорошо использовать когда нужно прописать большие куски хтмл кода внутри php функций. Чтобы сохранить читабельность кода.

Для этого нужно использовать конструкцию ob_start() … ob_get_contents(); ob_end_clean(); Которая позволяет вывод упаковать в переменную и далее обрабатывать ее или возвращать как положено.

Примеры:

add_shortcode('donation-posts', 'fnDonatePosts');
function fnDonatePosts($attr, $content) {
   ob_start();
   
   //можно echo выпустить
   echo "Привет!";
   
   //можно запросить php шаблон, в котором например будет HTML вставка
   get_template_part('donation', 'posts');

   //с тем же успехом можно вставить кусок HTML кода, предварительно закрыв и потом открыв обратно пхп скобки
   ?>
   <div><p>Тут какой то ХТМЛ текст.</p></div>
   <?php

   $html = ob_end_clean(); //упаковка вывода в переменную и очистка вывода

   return $html; //возврат переменной
}

 

Похожий пример, только если работать с хуком the_content и выводить данные после содержимого поста.

add_action('the_content', 'section_event_list_outcomes');

function section_event_list_outcomes($content) {
  if( is_singular('event') ){
   ob_start();
   ?>
   <section id="events_outcomes_list">
    <p>Тут какой то ХТМЛ текст.</p>
   </section>
   <?php
   $content .= ob_get_contents();
   ob_end_clean();
  }
 return $content;
}