我想创建一个帖子小工具,并能够选择类别

时间:2015-03-16 作者:Silviu Andrei

你能告诉我如何创建一个wordpress帖子小部件,根据类别选择输出帖子(所有帖子类别的类别复选框)

这是我的表单函数:

<?php
foreach ( get_categories() as $category ) : ?>

    <p>
    <input class="checkbox" type="checkbox" id="" name="" />
    <label for=""><?php echo $category->name ?></label>
    </p>    

<?php endforeach; ?>
目前,我只是选择在文本字段中添加类别slug,并将其用于\'category_name\' WP\\u查询中的参数

我就是不能把我的头放在这上面。谢谢你的帮助。

1 个回复
SO网友:Pieter Goosen

我最近写了一个小部件

获取内置分类法中的所有术语category 并将它们添加到小部件的下拉列表中

存储所选类别并在自定义中使用该类别WP_Query 获取和显示所选类别中的帖子

您可以查看它并根据需要进行调整:(需要PHP 5.4+

(EDIT: 感谢@birgire发现array()[] 符号已更正为仅使用[]

<?php
/**
 * Category_Posts widget class
 *
 * Displays posts from a selected category
 *
 * @since 1.0.0
*/
class Category_Posts extends WP_Widget 
{

    public function __construct() 
    {
        parent::__construct(
            \'widget_category_posts\', 
            _x( \'Category Posts Widget\', \'Category Posts Widget\' ), 
            [ \'description\' => __( \'Display a list of posts from a selected category.\' ) ] 
        );
        $this->alt_option_name = \'widget_category_posts\';

        add_action( \'save_post\', [$this, \'flush_widget_cache\'] );
        add_action( \'deleted_post\', [$this, \'flush_widget_cache\'] );
        add_action( \'switch_theme\', [$this, \'flush_widget_cache\'] );
    }

    public function widget( $args, $instance ) 
    {
        $cache = [];
        if ( ! $this->is_preview() ) {
            $cache = wp_cache_get( \'widget_cat_posts\', \'widget\' );
        }

        if ( ! is_array( $cache ) ) {
            $cache = [];
        }

        if ( ! isset( $args[\'widget_id\'] ) ) {
            $args[\'widget_id\'] = $this->id;
        }

        if ( isset( $cache[ $args[\'widget_id\'] ] ) ) {
            echo $cache[ $args[\'widget_id\'] ];
            return;
        }

        ob_start();

        $title          = ( ! empty( $instance[\'title\'] ) ) ? $instance[\'title\'] : __( \'Category Posts\' );
        /** This filter is documented in wp-includes/default-widgets.php */
        $title          = apply_filters( \'widget_title\', $title, $instance, $this->id_base );
        $number         = ( ! empty( $instance[\'number\'] ) ) ? absint( $instance[\'number\'] ) : 5;
        if ( ! $number ) {
            $number = 5;
        }
        $cat_id         = $instance[\'cat_id\'];
        $random         = $instance[\'rand\'] ? true : false; 
        $excerpt        = $instance[\'excerpt\'] ? true : false; 
        $thumbnail      = $instance[\'thumbnail\'] ? true : false; 

        /**
         * Filter the arguments for the Category Posts widget.
         *
         * @since 1.0.0
         *
         * @see WP_Query::get_posts()
         *
         * @param array $args An array of arguments used to retrieve the category posts.
         */
        if( true === $random ) {

            $query_args = [
                \'posts_per_page\'    => $number,
                \'cat\'               => $cat_id,
                \'orderby\'           => \'rand\'
            ];

        }else{  

            $query_args = [
                \'posts_per_page\'    => $number,
                \'cat\'               => $cat_id,
            ];

        }
        $q = new WP_Query( apply_filters( \'category_posts_args\', $query_args ) );

        if( $q->have_posts() ) {

            echo $args[\'before_widget\'];
            if ( $title ) {
                echo $args[\'before_title\'] . $title . $args[\'after_title\'];
            }               

            while( $q->have_posts() ) {
                $q->the_post(); ?>

                <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 

                    <header class="entry-header">
                        <?php the_title( \'<h1 class="entry-title"><a href="\' . esc_url( get_permalink() ) . \'" rel="bookmark">\', \'</a></h1>\' ); ?>
                    </header><!-- .entry-header -->

                    <?php 
                    if ( has_post_thumbnail() && true === $thumbnail ) { ?>

                        <div class="post-thumbnail">

                            <?php the_post_thumbnail(); ?>

                        </div><!--/.post-thumbnail-->

                    <?php   
                    }

                    if( true === $excerpt ) { ?>    

                        <div class="entry-summary">
                            <?php the_excerpt(); ?>
                        </div><!-- .entry-summary -->

                    <?php } ?>

                </article><!-- #post-## -->

                <?php
            }


            wp_reset_postdata();
        }
            echo $args[\'after_widget\']; 

        if ( ! $this->is_preview() ) {
            $cache[ $args[\'widget_id\'] ] = ob_get_flush();
            wp_cache_set( \'widget_cat_posts\', $cache, \'widget\' );
        } else {
            ob_end_flush();
        }
    }

    public function update( $new_instance, $old_instance ) 
    {
        $instance                   = $old_instance;
        $instance[\'title\']          = strip_tags( $new_instance[\'title\'] );
        $instance[\'number\']         = (int) $new_instance[\'number\'];
        $instance[\'cat_id\']         = (int) $new_instance[\'cat_id\'];
        $instance[\'rand\']           = $new_instance[\'rand\'];
        $instance[\'excerpt\']        = $new_instance[\'excerpt\'];
        $instance[\'thumbnail\']      = $new_instance[\'thumbnail\'];
        $this->flush_widget_cache();

        $alloptions = wp_cache_get( \'alloptions\', \'options\' );
        if ( isset($alloptions[\'widget_category_posts\']) )
            delete_option(\'widget_category_posts\');

        return $instance;
    }

    public function flush_widget_cache() 
    {
        wp_cache_delete(\'widget_cat_posts\', \'widget\');
    }

    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\'] ) ? absint( $instance[\'cat_id\'] ) : 1;
        $random     = isset( $instance[\'rand\'] ) ? $instance[\'rand\'] : false; 
        $excerpt    = isset( $instance[\'excerpt\'] ) ? $instance[\'excerpt\'] : false; 
        $thumbnail  = isset( $instance[\'thumbnail\'] ) ? $instance[\'thumbnail\'] : false; 
        ?>

        <p>
            <label for="<?php echo $this->get_field_id( \'title\' ); ?>"><?php _e( \'Title:\' ); ?></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:\' ); ?></label>
            <input id="<?php echo $this->get_field_id( \'number\' ); ?>" name="<?php echo $this->get_field_name( \'number\' ); ?>" type="text" value="<?php echo $number; ?>" size="3" />
        </p>

        <p>
            <label for="<?php echo $this->get_field_id(\'cat_id\'); ?>"><?php _e( \'Category Name:\' )?></label>
            <select id="<?php echo $this->get_field_id(\'cat_id\'); ?>" name="<?php echo $this->get_field_name(\'cat_id\'); ?>">
                <?php 
                $this->categories = get_categories();
                foreach ( $this->categories as $cat ) {
                    $selected = ( $cat->term_id == esc_attr( $cat_id ) ) ? \' selected = "selected" \' : \'\';
                    $option = \'<option \'.$selected .\'value="\' . $cat->term_id;
                    $option = $option .\'">\';
                    $option = $option .$cat->name;
                    $option = $option .\'</option>\';
                    echo $option;
                }
                ?>
            </select>
        </p>

        <p>
            <label for="<?php echo $this->get_field_id(\'rand\'); ?>"><?php _e( \'Show random posts\' ); ?></label>
            <?php $checked = ( $random ) ? \' checked=\\"checked\\" \' : \'\'; ?>
            <input type="checkbox" id="<?php echo $this->get_field_id( \'rand\' ); ?>" name="<?php echo $this->get_field_name( \'rand\' ); ?>" value="true" <?php echo $checked; ?> />    
        </p>

        <p>
            <label for="<?php echo $this->get_field_id(\'excerpt\'); ?>"><?php _e( \'Show excerpt. If unchecked, only the title of the post will be displayed\' ); ?></label>
            <?php $checked = ( $excerpt ) ? \' checked=\\"checked\\" \' : \'\'; ?>
            <input type="checkbox" id="<?php echo $this->get_field_id( \'excerpt\' ); ?>" name="<?php echo $this->get_field_name( \'excerpt\' ); ?>" value="true" <?php echo $checked; ?> />    
        </p>

        <p>
            <label for="<?php echo $this->get_field_id(\'thumbnail\'); ?>"><?php _e( \'Hide post thumbnail\' ); ?></label>
            <?php $checked = ( $thumbnail ) ? \' checked=\\"checked\\" \' : \'\'; ?>
            <input type="checkbox" id="<?php echo $this->get_field_id( \'thumbnail\' ); ?>" name="<?php echo $this->get_field_name( \'thumbnail\' ); ?>" value="true" <?php echo $checked; ?> />    
        </p>

    <?php
    }

}

add_action( \'widgets_init\', function () 
{
    register_widget( \'Category_Posts\' );
});

结束

相关推荐

Using categories with pages

我正在尝试使用页面类别(而不是帖子)作为筛选子页面的一种方式。我正在努力创建一个“工作”页面,其中列出了所有的子项,并且每个子项也将对其应用类别。另一个子菜单将允许您选择类别,并且仅列出这些子页面。迄今为止:functions.php - Show categories meta box for pagesfunction myplugin_settings() { register_taxonomy_for_object_type(\'category\', \'page\');