选择要在新闻框中显示的特定帖子

时间:2014-07-28 作者:tibewww

我正在建立一个基于帖子的网站(一种博客平台)。

然而,我希望能够从任何类别中选择哪个帖子显示在新闻框系统的主页中。我一直在尝试的所有插件/主题都会自动显示最近或仅一个类别或标签中的插件/主题。

问题是,我希望能够从任何类别中选择一个特定的帖子。

有没有办法做到这一点?如果有人能给我一个建议,那就太好了!

2 个回复
最合适的回答,由SO网友:Brad Dalton 整理而成

为什么不干脆post sticky 使用位于所有编辑帖子屏幕上的发布框中的可见性设置,并添加样式,使其看起来像新闻框。

enter image description here

SO网友:Pieter Goosen

这里有几个选项可以实现这一点,而无需使用插件。

OPTION 1

最简单的方法是在要显示帖子的位置使用自定义查询。这里你可以利用WP_Query 创建自定义查询。

最好的方法是使用post ID,您可以在自定义查询中使用该ID来检索和显示自定义post。看看Post and Page Parameters 在里面WP_Query.

一个非常简单的查询如下所示。用你自己的更改帖子ID

<?php
// The Query
$args = array(
    //\'p\' => 149\' //for single post
    //\'posts_per_page\' => 1, //for single post
    \'post__in\' => array( 149,159 ), //for multiple posts
    \'posts_per_page\' => 2, //for multiple posts
    \'ignore_sticky_posts\' => 1
);

$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) : 
    while ( $the_query->have_posts() ) : $the_query->the_post(); 
        ?>
            <h2><?php the_title(); ?></h2>
        <?php 
    endwhile; 
        wp_reset_postdata();
    else:  
endif; 

OPTION 2

如上所述,在内容中添加自定义查询。php类型的模板文件,称之为内容新闻。然后在任何模板中调用它,如下所示get_template_part( $slug, $name )

get_template_part( \'content\', \'news\' );
这样做的好处是,如果需要在多个位置使用自定义查询,则无需反复重复。每次只需调用一行代码

OPTION 3

如果您需要使其动态化,我建议您创建一个小部件。我想这将是一个特色内容区,所以我建议您register a new sidebar, 然后在你的标题中调用它。php就在开头的body标记之后。你可以利用conditional tags 在页面和模板上有条件地加载侧栏

要创建小部件,请查看Widget API. 也有非常好的教程,你可以看看。

我在这里的想法是,您可以在小部件内创建一个文本框,您可以在其中添加一个帖子ID或几个帖子ID,您可以将其安全地保存在数据库中。对于您的自定义查询(将在小部件中),您可以为要从db中检索的ID分配一个变量(您在文本框中手动添加的ID)。然后将反馈给该变量ppost__in.

这样,您只需在自定义小部件的文本框中更改您输入的帖子ID,就可以快速更改新闻框的内容,并且只需使用内置的拖放功能删除小部件。

这是一个我快速修改的小部件。您可以将帖子ID作为逗号分隔的字符串添加到小部件文本块的后端。这将转换为数组并传递给post__in. 这只是一个粗略的草稿小部件,所以可以随意修改它

class Posts_Widget extends WP_Widget {

    function __construct() {
        $widget_ops = array(\'classname\' => \'widget_posts\', \'description\' => __( \'Display selected posts from post ID&#8217;s\') );
        parent::__construct(\'posts_widget\', __(\'Posts Widget\'), $widget_ops);
    }

    function widget( $args, $instance ) {
    $cache = wp_cache_get( \'Posts_Widget\', \'widget\' );

    if ( !is_array( $cache ) )
        $cache = array();

    if ( ! isset( $args[\'widget_id\'] ) )
        $args[\'widget_id\'] = null;

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

    ob_start();
    extract( $args, EXTR_SKIP );

        ob_start();
        extract( $args );

        $title = apply_filters( \'widget_title\', empty( $instance[\'title\'] ) ? __( \'Important Posts\' ) : $instance[\'title\'], $instance, $this->id_base );

        $ids = empty( $instance[\'postids\'] ) ? \'\' : $instance[\'postids\'];

        $array_ids = array_map(\'intval\', explode(\',\', $ids));

        $ppp = count($array_ids);

        $pa = array(
            \'post__in\' => $array_ids,
            \'posts_per_page\' => $ppp,
            \'ignore_sticky_posts\' => 1
        );
        $widget_posts = new WP_Query( $pa );

        if ( $widget_posts->have_posts() ) :

        echo $before_widget;
        echo $before_title;
        echo $title; // Can set this with a widget option, or omit altogether
        echo $after_title;

        ?>
    <ul>
        <div class="custom-widget">
        <?php while ( $widget_posts->have_posts() ) : $widget_posts->the_post(); ?>

            <?php the_title(); ?>

        <?php endwhile; ?>

    </ul>
        <?php

        echo $after_widget;

        // Reset the post globals as this query will have stomped on it
        wp_reset_postdata();

        // end 
        endif;

    $cache[$args[\'widget_id\']] = ob_get_flush();
    wp_cache_set( \'Posts_Widget\', $cache, \'widget\' );
    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;
        $instance[\'title\'] = strip_tags($new_instance[\'title\']);

        $instance[\'postids\'] = strip_tags( $new_instance[\'postids\'] );

        return $instance;
    }

    function form( $instance ) {
        //Defaults
        $instance = wp_parse_args( (array) $instance, array( \'title\' => \'\', \'postids\' => \'\') );
        $title = esc_attr( $instance[\'title\'] );
        $ids = esc_attr( $instance[\'postids\'] );
    ?>
        <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(\'postids\'); ?>"><?php _e( \'Post ID&#8217;s:\' ); ?></label> <input type="text" value="<?php echo $ids; ?>" name="<?php echo $this->get_field_name(\'postids\'); ?>" id="<?php echo $this->get_field_id(\'postids\'); ?>" class="widefat" />
            <br />
            <small><?php _e( \'Post IDs, separated by commas.\' ); ?></small>
        </p>
<?php
    }
}

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

CONCLUSION

这应该给你一个解决问题的基本思路。我希望这对你有帮助

结束

相关推荐

Sort order in get_posts

我创建了一个custom template 对于客户。这将是一个多站点安装上的多语言站点设置。正如你在每个分类字母下看到的,帖子都是按字母顺序开始的,但“M”和“O”都不正常。如果您使用顶部的字母栏点击这些类别,这些帖子将按字母顺序排列。两个页面使用相同的代码,所以我不知道我做错了什么。我有一种感觉,我在某处有一个查询冲突,但我找不到它。下面是进行排序的代码:<section class=\"atozlist\"> <?php $newargs =