dashaluna
  • 0
Учитель

Отображать содержимое шорткода публикации на боковой панели?

  • 0

Мне нужно отображать изображения и другой контент на боковой панели в зависимости от страницы. Страницы добавляются динамически, и информация, которая должна отображаться на боковой панели, отличается для каждой страницы. Так что я не могу предсказать, что куда пойдет. Итак, идея заключалась в том, чтобы содержимое страницы было обычным (со всеми необходимыми шорткодами), а затем в конце содержимого страницы был шорткод со всей информацией, которая должна отображаться на боковой панели для этой страницы.


Оригинальный вопрос: выборочное отображение шорткодов (подавлять в основном контенте и вместо этого отображать на боковой панели)

Мне было интересно, можно ли отображать короткие коды «выборочно».

Например, определенный шорткод, назовем его [sc], указан в содержимом страницы. Теперь при отображении содержимого этой страницы я хотел бы подавить этот конкретный [sc] шорткод, а вместо этого отобразить его на боковой панели для этой страницы. Содержимое страницы будет иметь другие шорткоды. Я только хочу выборочно отображать конкретный [sc] шорткод и обрабатывать другие, как обычно, т.е. другие шорткоды будут обрабатываться в содержимом страницы.

Это возможно сделать? И как?

Share
  1. Я переписал ваш вопрос, используя ваше новое объяснение. Интересный подход к решению этой проблемы! Есть и другие способы сделать это (настраиваемые метаданные), но это, вероятно, самый простой способ реализации.

    • 0
    • Спасибо большое, Ян, очень помог! У меня нет виджетов, но есть простые файлы шаблонов и правая боковая панель. Так что все работало хорошо. Большое спасибо! 🙂

      • 0
    • Я исправил форматирование вашего кода: вам нужно четыре дополнительных пробела, потому что вы находитесь в списке. Таким образом, первые четыре пробела предназначены для добавления дополнительной строки к тому же элементу списка, а следующие четыре — для начала блока кода. Метод проб и ошибок может быть хорошим учителем 🙂

      • 0
    • Извините, я все еще не уверен, как я могу сделать то, что мне нужно. Я хочу отображать определенный шорткод [sc] на боковой панели (шаблон боковой панели) и подавлять его при выводе содержимого страницы, где он указан. Надеюсь, это имеет смысл.

      • 0
    • Если вы не укажете конкретный код в своем вопросе, вы не получите конкретного ответа.

      • 0
  2. Обработчик шорткода не должен ничего возвращать, он может просто изменить глобальную переменную, которую вы позже прочитаете в виджете боковой панели. Если ваша боковая панель отображается после содержимого вашего сообщения (скорее всего, если это правая боковая панель), вы можете сделать это без проблем. Если ваша боковая панель отображается перед содержимым публикации, все сложнее: вам нужно запустить буферизацию вывода при вызове вашего виджета, подождать, пока отобразится остальная часть страницы, а затем сделать что-то с содержимым шорткода и очистить буфер вывода.

    Простое «доказательство концепции», отображающее содержимое шорткода не в посте, а в футере:

    $wpse13925_shortcode_content = array();
    
    add_shortcode( '13925', 'wpse13925_shortcode' );
    function wpse13925_shortcode( $shortcode_attr, $shortcode_content )
    {
        $GLOBALS['wpse13925_shortcode_content'][] = $shortcode_content;
        return '';
    }
    
    add_action( 'wp_footer', 'wpse13925_footer' );
    function wpse13925_footer()
    {
        var_dump( $GLOBALS['wpse13925_shortcode_content'] );
    }
    
    • 0
  3. Я основал свое решение на Jan Fabry's ответе. У меня не виджеты, а простые файлы шаблонов.

    Итак, я сделал следующее:

    1. Указана вся информация, которая должна отображаться на боковой панели внутри самого содержимого страницы, завернутая в [sidebar_content] шорткод.

    2. В файле functions.php указана следующая функция. Это расширяет все содержимое [sidebar_content], но ничего не отображает, а вместо этого сохраняет его в глобальной переменной.

      global $sidebar_content;
      add_shortcode("sidebar_content", "my_sidebar_content");
      function my_sidebar_content($atts, $content = null){
          global $sidebar_content;
          if( !empty($content) ){
              $sidebar_content = do_shortcode($content);
          }
          return "";
      }
      
    3. В sidebar.php . У меня есть следующий код:

      global $sidebar_content;
      if( isset($sidebar_content) && !empty($sidebar_content) ){
        echo $sidebar_content;
      }
      
    • 0
  4. Вы можете использовать условные теги и do_shortcode. http://codex.wordpress.org/Function_Reference/do_shortcode
    http://codex.wordpress.org/Conditional_Tags

    Простой пример для одной страницы с идентификатором 12.

    if is_single(12){
    do_shortcode('[shortcode]');
    }
    

    Если вместо этого вы сами написали этот шорткод, вы можете создать функцию, чтобы дать ему параметр отображения, например[shortcode('page=5, 6, 7', 'category', 'exclude=posts', 'whatever')]

    • 0
  5. Вы можете сделать это на основе настраиваемого поля, например, создать настраиваемое поле с именем sc_no_show и присвоить ему значение true. затем в вашей функции шорткода сделайте что-то вроде этого:

    function what_ever(){
        global $post;
        $no_show = get_post_meta($post->ID,'sc_no_show',true);
        if ($no_show)
            return '';
        //add your normal shortcode stuff here
    }
    

    Теперь на каждой странице или в сообщении у вас есть настраиваемые поля sc_no_show с именем, значение которого true не будет отображаться/

    • 0
  6. Вы можете использовать несколько правильно расположенных действий, чтобы просмотреть свой шорткод, если он обнаружен, установите флаг и запустите дополнительные действия, чтобы сначала удалить содержимое этого шорткода, а затем вторичное, чтобы выполнить этот шорткод на боковой панели. Наряду со всем этим создайте собственное простое действие внутри файла боковой панели и подключитесь к нему, когда вам нужно распечатать шорткод.

    Не следишь? Не вините вас, я не всегда хорошо объясняю идеи, поэтому вот пример в виде кода.

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

    <?php do_action( 'special_shortcode_content' ); ?>
    

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

    Затем нам нужно отсканировать сообщения, прежде чем произойдет цикл, проверить наличие определенного шорткода, я буду использовать [sc] в соответствии с вашим примером, и мы можем сделать это, подключившись к the_posts . Вместо того, чтобы использовать глобальную переменную, я предпочитаю просто обернуть код в класс и определить переменную класса внутри класса, которая будет действовать как флаг.

    class Page_Shortcode_to_Sidebar {
        private $has_shortcode = false;
        public function __construct() {
            if( is_admin() )
                return;
    
            add_action( 'the_posts', array( $this, 'check_for_shortcode' ) );
            add_filter( 'the_content', array( $this, 'remove_shortcode' ), 1 ); 
        }
        public function check_for_shortcode( $posts ) {
            if( empty( $posts ) )
                return $posts;
    
            if( !is_page() )
                return $posts;
    
            foreach( $posts as $post ) {
                if( !stripos( $post->post_content, '[sc]' ) )
                    continue;
                $this->has_shortcode = true;
            }
            return $posts;
        }
        public function remove_shortcode( $content ) {
    
            if( !$this->has_shortcode )
                return $content;
    
            $content = str_replace( '[sc]', '', $content );
            add_action( 'special_shortcode_content', array( $this, 'do_shortcode' ) );
    
            return $content;
        }
        public function do_shortcode() {
            ?>
            <li><?php do_shortcode('[sc]'); ?></li>
            <?php
        }
    }
    
    $Page_Shortcode_to_Sidebar = new Page_Shortcode_to_Sidebar;
    

    Так что в основном это происходит..

    1. Обратный вызов the_posts проверяет каждое сообщение на наличие шорткода, если он найден, устанавливает флаг.
    2. Обратный вызов the_content выполняется позже и проверяет, установлен ли флаг.
    3. Если флаг установлен, шорткод удаляется из содержимого и добавляет действие на нашу пользовательскую боковую панель.
    4. Он возвращает содержимое за вычетом определенного шорткода.
    5. Происходит действие боковой панели и создается содержимое шорткода.

    Если вы имеете в виду свой собственный шорткод, который вы создали, и он используется таким образом..

    [sc]something[/sc]
    

    .. тогда вам понадобится что-то более умное, чтобы отделить содержимое шорткода от содержимого сообщения.

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

    Надеюсь, это поможет.. 🙂

    • 0

Оставить ответ

You must login to add an answer.