Поддержка Проблемы и решения Шорткод с параметрами и свои функции

  • У меня есть своя функция и темплейт, выводящий большой html-блок.
    В нужных шаблонах, в месте, где надо вывести этот блок я прописываю код

    $post_ids = "123,125,156,234" ; //массив нужных ID.
      foreach ( $post_ids as $post_id ) {
      $arrayfun = myfunction(); // моя функция в файле функций. Возвращает массив arrayfun(): [return $arrayfun;]
      get_template_part( 'template-parts/templpage'); // мой теплейт шаблона, использующий  массив данных из myfunction()
      }
    

    Понадобилось вывести несколько таких блоков внутри контента на главной странице. Я решил, что нужно создать шорткод, в котором можно задавать значения $post_ids.
    Типа [myshorcode ids="123,125,156,234"]

    Понятно, что нужно создать шаблон главной. Это не проблема. Но дальше я впал в ступор. Никак я не пойму ни как создать шорткод передающий нужные значения, ни что как и куда прописать код, аналогичный выше приведённому.

    Помогите разобраться пожалуйста.

Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Автор Bayrhake

    (@bayrhake)

    По совету с другого ресурса использовать буферизацию и помощи Юрия в другом вопросе я составил такой код

    function postshortcode($atts) {
      ob_start();
      
      ?>
    <div class="postbar">
    	<?php  
    
    	$post_ids = explode(',', $atts['ids']);
    	
    	if (!$post_ids) echo "<b>Таких записей не нашлось</b><br>";
    
      foreach ( $post_ids as $post_id ) {
      $arrayfun = myfunction(); // моя функция в файле функций. Возвращает массив arrayfun(): [return $arrayfun;]
      get_template_part( 'template-parts/templpage'); // мой теплейт шаблона, использующий  массив данных из myfunction()
      }
    
    ?> 
    </div>
    <?php
      
      return ob_get_clean();	
      
    }
    
    add_shortcode( 'myshorcode', 'postshortcode' );

    Но моя функция не видит переданные ей ID.
    Пытался прописать global $arrayfun, но не получилось, куда бы его я его не вставлял.

    ЧЯДНТ? Куда надо прописать global и надо ли?

    Модератор Yuri

    (@yube)

    Но моя функция не видит переданные ей ID.

    Если Ваша функция — myfunction(), то ей в приведенном выше коде вообще ничего не передается.

    И то, что она возвращает (если возвращает), остается внутри функции postshortcode(). Ни глобально, ни внутри вызываемых из нее функций этого возвращаемого значения видно не будет.

    Как говорится, учите матчасть 🙂 https://www.php.net/

    Автор Bayrhake

    (@bayrhake)

    Стоило написать на форум и с передачей решил. Надо было объявить глобальными внутри функции шорткода $post_id и $arrayfun.

    function postshortcode($atts) {
      global $post_id;
      global $arrayfun;	
    
      ob_start();
      
      ?>
    <div class="postbar">
    	<?php  
    
    	$post_ids = explode(',', $atts['ids']);
    	
    	if (!$post_ids) echo "<b>Таких записей не нашлось</b><br>";
    
      foreach ( $post_ids as $post_id ) {
      $arrayfun = myfunction(); // моя функция в файле функций. Возвращает массив arrayfun(): [return $arrayfun;]
      get_template_part( 'template-parts/templpage'); // мой теплейт шаблона, использующий  массив данных из myfunction()
      }
    
    ?> 
    </div>
    <?php
      
      return ob_get_clean();	
      
    }
    
    add_shortcode( 'myshorcode', 'postshortcode' );
    

    Теперь вопрос о корректности данного кода.

    Во всех инструкциях в интернете весь результат шорткода возвращается через return. Напримр return "<div>результат</div>";
    Мне же надо поместить в div результат foreach, и уже я не очень понимаю такие вещи как буферизация.

    Я правильно состряпал такою конструкцию или надо как-то иначе?

    • Ответ изменён 4 года назад пользователем Bayrhake. Причина: иправление - return ob_get_clean();
Просмотр 3 ответов — с 1 по 3 (всего 3)
  • Тема «Шорткод с параметрами и свои функции» закрыта для новых ответов.