Я работаю над темой WordPress. Я использую плагин для отображения изображений на странице (для каждого сообщения 1 изображение). При нажатии на одно из этих изображений следующий код регистрирует это и открывает лайтбокс с содержанием сообщения в нем:
<?php
if($_REQUEST['popup']!=''){
$postObj = get_post( $_REQUEST['pid'] );echo '<div class="ostContent">'.$postObj->post_content.'</div>';
exit;
?>
Это все отлично работает.
Теперь проблема в том, что весь контент отображается красиво. но по какой-то причине шорткоды не работают. а также когда я использую виджет в плагине поста для отображения виджета в посте, он не отображается.
Сначала я подумал, что нужно включить шорткоды. Итак, я изменил это:
echo '<div class="ostContent">'.$postObj->post_content.'</div>';
с этим:
echo '<div class="ostContent">'.do_shortcode( $postObj->post_content ).'</div>';
Но все равно ничего. Так что теперь я понятия не имею, что нужно изменить, чтобы лайтбокс отображал виджеты
Надеюсь, кто-нибудь знает решение!
РЕДАКТИРОВАТЬ: когда я открываю пост за пределами лайтбокса (просто переходя на одну страницу), шорткод используется, как и должно быть. так что каким-то образом код выше не распознает шорткод или …
По образцу здесь: http://codex.wordpress.org/Function_Reference/do_shortcode
Похоже, вам нужно изменить: echo '<div class="ostContent">'.do_shortcode( $postObj->post_content ).'</div>';
чтобы:
echo '<div class="ostContent">'.do_shortcode([shortcode_in_brackets]).'</div>';
Это должно на самом деле отображать код. Я предполагаю, что вы определили фактический текст в виджете, к которому применяется шорткод.
В противном случае, так, как вы в настоящее время делаете это, PHP запускается до того, как post_content даже получит значение.
Я думаю, что понимаю вашу проблему.
Следующее должно работать, предполагая, что рассматриваемые посты имеют post_type
из post
:
<?php
// Check for existence of 'popup' & 'pid' query vars
if ( $_REQUEST['popup'] && $_REQUEST['pid'] ) {
// Select single post by ID (using value of the 'pid' query var)
$query = new WP_Query( array ( 'p' => $_REQUEST['pid'] ) );
// Check that the query has returned something
if ($query->have_posts()) {
/* Loop through query until we run out of posts
(should only happen once in this case!) */
while ($query->have_posts()) {
// Setup post, so we can use the_content() and stuff
the_post();
echo '<div class="ostContent">';
/* The part we've been waiting for! the_content() will
display your post content as expected */
the_content();
echo '</div>';
}
}
}
?>
WP_Query
это путь, который требуется в большинстве случаев для получения сообщений: http://codex.wordpress.org/Class_Reference/WP_Query
Ваш код извлекал и отображал данные практически непосредственно из таблицы сообщений WordPress, что не давало WordPress возможности применить какие-либо внутренние действия и фильтры (например, автоматические абзацы из двойных разрывов строк, выполнение шорткода).