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

В интернете есть множество отличных руководств по шорткодам, а также хорошие примеры здесь.
Но чтобы вы могли начать:
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 записи фильма.
Надеюсь, это поможет.

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

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

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

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

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

Попробуйте начать с этого руководства.
В callback-функции выполните custom_query (или используйте get_post) для записи и извлеките только нужные вам значения (например, заголовок, краткое описание...).
Пример шорткода:
[film id=10]
Используйте id в вашей функции для получения содержимого фильма.
