#php #widget #wordpress
#php #виджет #wordpress
Вопрос:
Я пытаюсь отобразить пользовательское поле в виджете, который я настраиваю, но я не могу заставить пользовательское поле отображаться. Я думаю, это как-то связано с переменной, которую я использую для получения идентификатора записи в цикле, потому что когда я меняю ее на стандартную функцию the_title, виджет работает, так что это как-то связано с тем, как я вызываю пользовательское поле.
Я знаю, что ключом к пользовательскому полю является «wpcf-promo-title», но независимо от того, что я пробовал, пользовательское поле (которое содержит сокращенную версию заголовка публикации для боковой панели) просто не будет отображаться. В результате этого кода отображаются эскизы, но не название промо-акции. Вы можете увидеть это в действии на http://www.cantstopshipping.com
Вот мой код, включая запрос и интерфейс виджета.
function widget($args, $instance) {
extract( $args );
$title = apply_filters( 'widget_title', empty($instance['title']) ? 'Recent Posts' : $instance['title'], $instance, $this->id_base);
$show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : false;
if ( ! $number = absint( $instance['number'] ) ) $number = 5;
if( ! $cats = $instance["cats"] ) $cats='';
// array to call recent posts.
$crpw_args=array(
'showposts' => $number,
'category__in'=> $cats,
);
$crp_widget = null;
$crp_widget = new WP_Query($crpw_args);
echo $before_widget;
// Widget title
echo $before_title;
echo $instance["title"];
echo $after_title;
// Post list in widget
echo "<ul>n";
while ( $crp_widget->have_posts() )
{
$crp_widget->the_post();
?>
<li class="crpw-item">
<p style="float:left">
<a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent link to <?php the_title_attribute(); ?>" class="crpw-title"><?php the_post_thumbnail('sidebar-small'); ?></a>
</p>
<?php $promotitle = get_post_meta($post->ID, 'wpcf-promo-title', true); ?>
<p style="float:right; width:200px">
<a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent link to <?php the_title_attribute(); ?>" class="crpw-title"><?php echo $promotitle; ?></a>
</p>
<?php if ( $show_date ) : ?>
<span class="crpw-date"><?php echo "("; ?><?php echo get_the_date(); ?><?php echo ")"; ?></span>
<?php endif; ?>
</li>
<?php
}
wp_reset_query();
echo "<div class="fix"></div>";
echo "</ul>n";
echo $after_widget;
}
Ответ №1:
Похоже, что ваше global $post
отсутствует.
Но вы могли бы попробовать get_the_ID()
вместо $post->ID
.
Вам также следует подумать о том, чтобы избавиться от extract()
, сейчас это считается «плохой» практикой.
Другое дело, что вы должны использовать wp_reset_postdata()
для восстановления глобального $post
объекта. wp_reset_query()
Вызов должен использоваться с query_posts()
вызовом.
Комментарии:
1. И спасибо вам также за другие ваши предложения! Я попытаюсь их реализовать (что-то новое в плагинах)!
2. Рад слышать, что у вас это сработало. Желаю удачи в разработке плагина.