最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

How do i bring out post category name in my widget?

programmeradmin3浏览0评论

I customize the repeat post widget and add little functionalities to it. Everything is working fine but my challenge now is that the widget when used is not bringing out individual post category name. What am I gettin wrong in the widget as it output one post category even though the post link falls into another category.

View my site www.wordpress.bestrackservices/.

I have post in national, economy and others and it keeps showing entertainment even when the post category is not in it.

You will view the complete code of my carousel slider:

<?php
    /**
     * WP_Widget_Carousel_Slider
     *
     * @since 2.8.0
     */
class WP_Widget_Carousel_Slider extends WP_Widget {


    public function __construct() {
        $widget_ops = array(
            'classname'                   => 'widget_carousel_entries',
            'description'                 => __( 'Your site&#8217;s most Carousel Slider.', 'bobo'),
            'customize_selective_refresh' => true,
        );
        parent::__construct( 'carousel-slider', __( 'Carousel Slider', 'bobo' ), $widget_ops );

    }

    /**
     * Outputs the content for the current Carousel Slider widget instance.
     *
     * @since 2.8.0
     *
     * @param array $args     Display arguments including 'before_title', 'after_title',
     *                        'before_widget', and 'after_widget'.
     * @param array $instance Settings for the current Carousel Slider widget instance.
     */
    public function widget( $args, $instance ) {
        if ( ! isset( $args['widget_id'] ) ) {
            $args['widget_id'] = $this->id;
        }

        $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Carousel Slider',  'bobo');

        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

        $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
        if ( ! $number ) {
            $number = 5;
        }

        $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : true;
        $show_cats = isset( $instance['show_cats'] ) ? $instance['show_cats'] : true;

        /**
         * Filters the arguments for the Carousel Slider widget.
         *
         * @since 3.4.0
         * @since 4.9.0 Added the `$instance` parameter.
         *
         * @see WP_Query::get_posts()
         *
         * @param array $args     An array of arguments used to retrieve the Carousel Slider.
         * @param array $instance Array of settings for the current widget.
         */
        $r = new WP_Query(
            apply_filters(
                'widget_posts_args',
                array(
                    'posts_per_page'      => $number,
                    'no_found_rows'       => true,
                    'post_status'         => 'publish',
                    'ignore_sticky_posts' => true,
                ),
                $instance
            )
        );

        if ( ! $r->have_posts() ) {
            return;
        }
        ?>
        <?php echo $args['before_widget']; ?>
        <?php
        if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        ?>
        <ul>
            <?php foreach ( $r->posts as $carousel_post ) : ?>
                <?php
                $post_title = get_the_title( $carousel_post->ID );
                $title      = ( ! empty( $post_title ) ) ? $post_title : __( '( title)', 'bobo' );
                ?>
                <li>
                    <a href="<?php the_permalink( $carousel_post->ID ); ?>"><?php echo $title; ?></a>
                    <?php if ( $show_date ) : ?>
                        <span class="post-date"><?php echo get_the_date( '', $carousel_post->ID ); ?></span>
                    <?php endif; ?>
                </li>
            <?php endforeach; ?>
        </ul>
        <?php
        echo $args['after_widget'];
    }

    /**
     * Handles updating the settings for the current Carousel Slider widget instance.
     *
     * @since 2.8.0
     *
     * @param array $new_instance New settings for this instance as input by the user via
     *                            WP_Widget::form().
     * @param array $old_instance Old settings for this instance.
     * @return array Updated settings to save.
     */
    public function update( $new_instance, $old_instance ) {
        $instance              = $old_instance;
        $instance['title']     = sanitize_text_field( $new_instance['title'] );
        $instance['number']    = (int) $new_instance['number'];
        $instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : true;
        $instance['show_cats'] = isset( $new_instance['show_cats'] ) ? (bool) $new_instance['show_cats'] : true;
        return $instance;
    }

    /**
     * Outputs the settings form for the Carousel Slider widget.
     *
     * @since 2.8.0
     *
     * @param array $instance Current settings.
     */
    public function form( $instance ) {
        $title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        $cat_id = isset( $instance['cat_id'] ) ? (bool) $instance['show_cats'] : true;
        $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : true;
        ?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bobo' ); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:', 'bobo' ); ?></label>
        <input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>
        <p>

            <p>
            <input class="checkbox" type="checkbox" <?php checked( $instance['show_cats'], 'on' ); ?> id="<?php echo $this->get_field_id( 'show_cats' ); ?>" name="<?php echo $this->get_field_name( 'show_cats' ); ?>" />
            <label for="<?php echo $this->get_field_id( 'show_cats' ); ?>">Show Category</label>
        </p>



        <p>
            <label for="<?php echo $this->get_field_id('category'); ?>"><?php _e('Category (if selected above):', 'bobo'); ?></label>
            <?php
            $activeoptions = $instance['category'];
            if (!$activeoptions)
            {
                $activeoptions = array();
            }
            ?>

            <select multiple="true" id="<?php echo $this->get_field_id('category'); ?>" name="<?php echo $this->get_field_name('category'); ?>[]" >

            <?php
                $cats = get_categories('hide_empty=0');

                foreach ($cats as $cat) {
                $option = '<option value="'.$cat->term_id;
                if ( in_array($cat->term_id,$activeoptions)) { $option .='" selected="selected'; }
                $option .= '">';
                $option .= $cat->cat_name;
                $option .= ' ('.$cat->category_count.')';
                $option .= '</option>';
                echo $option;
                }
            ?>
            </select>
        </p>


        <p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
        <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' , 'bobo' ); ?></label></p>
        <?php
    }
}

add_action( 'widgets_init', function () 
{
    register_widget( 'WP_Widget_Carousel_Slider' );
});

I customize the repeat post widget and add little functionalities to it. Everything is working fine but my challenge now is that the widget when used is not bringing out individual post category name. What am I gettin wrong in the widget as it output one post category even though the post link falls into another category.

View my site www.wordpress.bestrackservices/.

I have post in national, economy and others and it keeps showing entertainment even when the post category is not in it.

You will view the complete code of my carousel slider:

<?php
    /**
     * WP_Widget_Carousel_Slider
     *
     * @since 2.8.0
     */
class WP_Widget_Carousel_Slider extends WP_Widget {


    public function __construct() {
        $widget_ops = array(
            'classname'                   => 'widget_carousel_entries',
            'description'                 => __( 'Your site&#8217;s most Carousel Slider.', 'bobo'),
            'customize_selective_refresh' => true,
        );
        parent::__construct( 'carousel-slider', __( 'Carousel Slider', 'bobo' ), $widget_ops );

    }

    /**
     * Outputs the content for the current Carousel Slider widget instance.
     *
     * @since 2.8.0
     *
     * @param array $args     Display arguments including 'before_title', 'after_title',
     *                        'before_widget', and 'after_widget'.
     * @param array $instance Settings for the current Carousel Slider widget instance.
     */
    public function widget( $args, $instance ) {
        if ( ! isset( $args['widget_id'] ) ) {
            $args['widget_id'] = $this->id;
        }

        $title = ( ! empty( $instance['title'] ) ) ? $instance['title'] : __( 'Carousel Slider',  'bobo');

        /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */
        $title = apply_filters( 'widget_title', $title, $instance, $this->id_base );

        $number = ( ! empty( $instance['number'] ) ) ? absint( $instance['number'] ) : 5;
        if ( ! $number ) {
            $number = 5;
        }

        $show_date = isset( $instance['show_date'] ) ? $instance['show_date'] : true;
        $show_cats = isset( $instance['show_cats'] ) ? $instance['show_cats'] : true;

        /**
         * Filters the arguments for the Carousel Slider widget.
         *
         * @since 3.4.0
         * @since 4.9.0 Added the `$instance` parameter.
         *
         * @see WP_Query::get_posts()
         *
         * @param array $args     An array of arguments used to retrieve the Carousel Slider.
         * @param array $instance Array of settings for the current widget.
         */
        $r = new WP_Query(
            apply_filters(
                'widget_posts_args',
                array(
                    'posts_per_page'      => $number,
                    'no_found_rows'       => true,
                    'post_status'         => 'publish',
                    'ignore_sticky_posts' => true,
                ),
                $instance
            )
        );

        if ( ! $r->have_posts() ) {
            return;
        }
        ?>
        <?php echo $args['before_widget']; ?>
        <?php
        if ( $title ) {
            echo $args['before_title'] . $title . $args['after_title'];
        }
        ?>
        <ul>
            <?php foreach ( $r->posts as $carousel_post ) : ?>
                <?php
                $post_title = get_the_title( $carousel_post->ID );
                $title      = ( ! empty( $post_title ) ) ? $post_title : __( '( title)', 'bobo' );
                ?>
                <li>
                    <a href="<?php the_permalink( $carousel_post->ID ); ?>"><?php echo $title; ?></a>
                    <?php if ( $show_date ) : ?>
                        <span class="post-date"><?php echo get_the_date( '', $carousel_post->ID ); ?></span>
                    <?php endif; ?>
                </li>
            <?php endforeach; ?>
        </ul>
        <?php
        echo $args['after_widget'];
    }

    /**
     * Handles updating the settings for the current Carousel Slider widget instance.
     *
     * @since 2.8.0
     *
     * @param array $new_instance New settings for this instance as input by the user via
     *                            WP_Widget::form().
     * @param array $old_instance Old settings for this instance.
     * @return array Updated settings to save.
     */
    public function update( $new_instance, $old_instance ) {
        $instance              = $old_instance;
        $instance['title']     = sanitize_text_field( $new_instance['title'] );
        $instance['number']    = (int) $new_instance['number'];
        $instance['show_date'] = isset( $new_instance['show_date'] ) ? (bool) $new_instance['show_date'] : true;
        $instance['show_cats'] = isset( $new_instance['show_cats'] ) ? (bool) $new_instance['show_cats'] : true;
        return $instance;
    }

    /**
     * Outputs the settings form for the Carousel Slider widget.
     *
     * @since 2.8.0
     *
     * @param array $instance Current settings.
     */
    public function form( $instance ) {
        $title     = isset( $instance['title'] ) ? esc_attr( $instance['title'] ) : '';
        $number    = isset( $instance['number'] ) ? absint( $instance['number'] ) : 5;
        $cat_id = isset( $instance['cat_id'] ) ? (bool) $instance['show_cats'] : true;
        $show_date = isset( $instance['show_date'] ) ? (bool) $instance['show_date'] : true;
        ?>
        <p><label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bobo' ); ?></label>
        <input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></p>

        <p><label for="<?php echo $this->get_field_id( 'number' ); ?>"><?php _e( 'Number of posts to show:', 'bobo' ); ?></label>
        <input class="tiny-text" id="<?php echo $this->get_field_id( 'number' ); ?>" name="<?php echo $this->get_field_name( 'number' ); ?>" type="number" step="1" min="1" value="<?php echo $number; ?>" size="3" /></p>
        <p>

            <p>
            <input class="checkbox" type="checkbox" <?php checked( $instance['show_cats'], 'on' ); ?> id="<?php echo $this->get_field_id( 'show_cats' ); ?>" name="<?php echo $this->get_field_name( 'show_cats' ); ?>" />
            <label for="<?php echo $this->get_field_id( 'show_cats' ); ?>">Show Category</label>
        </p>



        <p>
            <label for="<?php echo $this->get_field_id('category'); ?>"><?php _e('Category (if selected above):', 'bobo'); ?></label>
            <?php
            $activeoptions = $instance['category'];
            if (!$activeoptions)
            {
                $activeoptions = array();
            }
            ?>

            <select multiple="true" id="<?php echo $this->get_field_id('category'); ?>" name="<?php echo $this->get_field_name('category'); ?>[]" >

            <?php
                $cats = get_categories('hide_empty=0');

                foreach ($cats as $cat) {
                $option = '<option value="'.$cat->term_id;
                if ( in_array($cat->term_id,$activeoptions)) { $option .='" selected="selected'; }
                $option .= '">';
                $option .= $cat->cat_name;
                $option .= ' ('.$cat->category_count.')';
                $option .= '</option>';
                echo $option;
                }
            ?>
            </select>
        </p>


        <p><input class="checkbox" type="checkbox"<?php checked( $show_date ); ?> id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" />
        <label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Display post date?' , 'bobo' ); ?></label></p>
        <?php
    }
}

add_action( 'widgets_init', function () 
{
    register_widget( 'WP_Widget_Carousel_Slider' );
});
Share Improve this question edited Apr 19, 2020 at 13:21 Tom J Nowell 61.1k7 gold badges79 silver badges148 bronze badges asked Apr 19, 2020 at 13:01 Shaibu Stephen OjateShaibu Stephen Ojate 11 bronze badge 1
  • 1 I can't find anything in your widget method that references categories. It appears your widget doesn't show posts from the selected category because you don't tell it to – Tom J Nowell Commented Apr 19, 2020 at 13:25
Add a comment  | 

1 Answer 1

Reset to default 0

Ok. That is a good observation. How should i make the adjustment then. Let me know what needs to be done about it to correct how to make it select category?

发布评论

评论列表(0)

  1. 暂无评论