Не удается отобразить пользовательское поле в виджете

#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. Рад слышать, что у вас это сработало. Желаю удачи в разработке плагина.