Как создать шорткод для отображения произвольной записи на странице или в обычной записи?

18 февр. 2011 г., 14:40:35
Просмотры: 37.7K
Голосов: 1

Я хотел бы создать шорткод, который будет извлекать информацию из произвольной записи и отображать её на Странице или в обычной Записи.

Конкретный случай использования: у меня есть произвольный тип записи "Фильм" для сайта кинофестиваля. Фильмы отображаются с помощью их собственного single-film.php, но иногда владельцам сайта нужно написать пост или страницу, упоминающую определенный фильм, и они хотели бы иметь возможность извлекать фрагменты уже введенной информации (например, название фильма, информацию о бронировании и т.д.). Это должно размещаться в "блоке" внизу поста, и я хотел бы упростить им задачу, предоставив какой-то шорткод.

Как мне это реализовать? Какие рекомендуемые ресурсы/руководства помогут мне начать? Какие подводные камни следует учитывать (например, множественные циклы в записи)?

0
Все ответы на вопрос 2
8

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

Но чтобы вы могли начать:

add_shortcode('film_q', 'film_shortcode_query');
function film_shortcode_query($atts, $content){
  extract(shortcode_atts(array( // несколько значений по умолчанию
   'posts_per_page' => '1',
   'post_type' => 'film',
   'caller_get_posts' => 1)
   , $atts));

  global $post;

  $posts = new WP_Query($atts);
  $output = '';
    if ($posts->have_posts())
        while ($posts->have_posts()):
            $posts->the_post();
            $out = '<div class="film_box">
                <h4>Название фильма: <a href="'.get_permalink().'" title="' . get_the_title() . '">'.get_the_title() .'</a></h4>
                <p class="Film_desc">'.get_the_content().'</p>';
                // можно добавить больше элементов...
            $out .='</div>';
    /* эти аргументы будут доступны внутри $content
        get_permalink()  
        get_the_content()
        get_the_category_list(', ')
        get_the_title()
        и пользовательские поля
        get_post_meta($post->ID, 'field_name', true);
    */
    endwhile;
  else
    return; // посты не найдены

  wp_reset_query();
  return html_entity_decode($out);
}

Чтобы использовать этот шорткод, вставьте в любую запись/страницу:

[film_q p=ID_ЗАПИСИ_ФИЛЬМА]

Просто замените ID_ЗАПИСИ_ФИЛЬМА на реальный ID записи фильма.

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

18 февр. 2011 г. 15:36:41
Комментарии

Привет... По какой-то причине шорткод не извлекает post_type=film правильно? Если я делаю var_dump для $posts, то стандартные значения, указанные в extract, вообще не используются? Может быть, мне нужно возвращать что-то другое вместо $atts для использования в new WP_Query()?

gillespieza gillespieza
19 февр. 2011 г. 20:52:21

Я предполагаю, что var_dump для $post выполняется не в функции шорткода. Если я прав, то вы вызываете var_dump в цикле вашей темы, и поэтому вы не видите аргументы, которые ожидали.

Bainternet Bainternet
19 февр. 2011 г. 20:59:46

А, я добавил это после extract: $film_query = 'posts_per_page='.$posts_per_page.'&post_type='.$post_type.'&p='.$id; и использовал $film_query вместо $atts в запросе. Спасибо :)

gillespieza gillespieza
19 февр. 2011 г. 21:13:43

где вы видите "$film_query = ...." ?

Bainternet Bainternet
19 февр. 2011 г. 21:16:46

Что делать, если мой фильм $content содержит шорткоды? Как правильно их обработать? Стоит ли создать фильтр для возвращаемого контента?

gillespieza gillespieza
19 февр. 2011 г. 21:45:05

Я создал $film_query для использования в $posts = new WP_Query($film_query);, потому что $atts давал мне только p=ID_ПОСТА_ФИЛЬМА без остальных параметров по умолчанию...

gillespieza gillespieza
19 февр. 2011 г. 21:46:53

Да, это так, get_the_content обходит фильтр the_content

Bainternet Bainternet
19 февр. 2011 г. 21:49:23

Хорошо, значит если я использую return (apply_filters ('the_content', $out) ); вместо return html_entity_decode($out);, то парсинг будет корректным :)

gillespieza gillespieza
19 февр. 2011 г. 22:05:38
Показать остальные 3 комментариев
0

Попробуйте начать с этого руководства.

В callback-функции выполните custom_query (или используйте get_post) для записи и извлеките только нужные вам значения (например, заголовок, краткое описание...).

Пример шорткода:

[film id=10]

Используйте id в вашей функции для получения содержимого фильма.

18 февр. 2011 г. 15:35:06