带有来自博客的外部网站随机帖子的小部件

时间:2012-07-02 作者:forallatlantis

我如何创建一个可定制的小部件,其中包含来自我博客的随机帖子,可以作为js、iframe或div发布在另一个网站上。是否有Wordpress插件?

2 个回复
SO网友:fuxia

要创建随机帖子的特殊输出,请执行以下操作:

  1. Register an endpoint 到你博客的根目录。看见A (Mostly) Complete Guide to the WordPress Rewrite API 有关详细信息\'template_redirect\' 并根据请求端点的详细信息返回输出。然后exit.
仅此而已。

嗯……一些代码可能有助于理解细节。:)

让我们为HTML和JSON输出构建一个小插件。

我已经给它命名了T5 Random Posts Endpoint; 所有代码都进入一个具有静态方法的类中,以保持全局命名空间干净。

add_action( \'init\', array ( \'T5_Random_Posts_Endpoint\', \'init\' ) );

/**
 * Build a root endpoint.
 */
class T5_Random_Posts_Endpoint
{
    /**
     * Register endpoint and actions.
     *
     * @wp-hook \'init\'
     * @return  void
     */
    public static function init()
    {
        add_rewrite_endpoint( \'randomposts\', EP_ROOT );
        add_filter( \'request\', array ( __CLASS__, \'filter_request\' ) );
        add_action( \'template_redirect\', array ( __CLASS__, \'render\' ) );
    }
}
如你所见,我们称之为中央init 方法打开\'init\' 初始化我们的插件。创意命名,嗯?

端点已命名randomposts 并附着在根部。所以激活后,您可以打开example.com/randomposts/example.com/randomposts/json/.

但是…如果调用第一个URL,则端点工作,请求变量randomposts 已设置–但已设置empty. 这就是为什么我们\'request\' 给变量adefault value 我们可以稍后再处理。让我们使用html 默认情况下:

    /**
     * Prepare the endpoint variable so it has always a value.
     *
     * @wp-hook \'request\'
     * @param   array $request
     * @return  array
     */
    public static function filter_request( $request )
    {
        if ( isset ( $request[\'randomposts\'] )
            and empty ( $request[\'randomposts\'] )
        )
        {
            $request[\'randomposts\'] = \'html\';
        }

        return $request;
    }
现在我们开始\'template_redirect\' 因此WordPress不会使用默认模板index.php 但我们自己的产出。

    /**
     * Create output.
     *
     * @wp-hook \'template_redirect\'
     * @return  void
     */
    public static function render()
    {
        // This is not our endpoint.
        if ( \'\' === $type = get_query_var( \'randomposts\' ) )
        {
            return;
        }

        // Someone is poking around.
        // You can extend this and build different output variants.
        if ( ! in_array( $type, array ( \'html\', \'json\' ) ) )
        {
            status_header( 414 );
            print \'Unsupported Media Type. Use "html" or "json" only.\';
            exit;
        }

        // Empty blog?
        if ( ! $posts = get_posts( array ( \'numberposts\' => 10, \'orderby\' => \'rand\' ) ) )
        {
            status_header( 404 );
            print \'No posts found.\';
            exit;
        }

        self::$type( self::prepare_post_data( $posts ) );
        exit;
    }
首先,我们通过查看get_query_var( \'randomposts\' ). 我们在请求过滤器中填充了这个变量,因此如果它仍然是空的,我们肯定知道这不是我们的事,我们会很快返回。

然后,我们测试该请求是否针对预定义的输出变量之theme test data六 或json. 如果有人打电话/randomposts/css/randomposts/lala 我们提出了一个414错误,并提供了一条有用的消息。然后退出。

然后我们终于得到了我们的帖子get_posts() 并在一个名为prepare_post_data():

    /**
     * Build a simple array with just titles and permalinks.
     *
     * @wp-hook \'template_redirect\'
     * @param   array $posts
     * @return void
     */
    protected static function prepare_post_data( $posts )
    {
        $data = array ();

        foreach ( $posts as $post )
        {
            if ( empty ( $post->post_title) )
            {
                continue;
            }

            $data[ $post->ID ] = array (
                \'title\' => strip_tags( $post->post_title ),
                \'url\'   => get_permalink( $post->ID )
            );
        }

        return $data;
    }
我们将此简单数组传递给一个名为的方法,该方法与我们的输出完全相同:html()json().<让我们从json(); 这是最简单的部分。看见How to encode post content as JSON? 了解一些背景知识。

    /**
     * Render JSON output
     *
     * @wp-hook \'template_redirect\'
     * @param  array $data
     * @return void
     */
    protected static function json( array $data )
    {
        header( \'Content-type: application/json\' );
        print json_encode( $data );
    }
很简单,不是吗?这个html() 不是那么难,只是更长:

        /**
         * Render HTML output
         *
         * @wp-hook \'template_redirect\'
         * @param  array $data
         * @return void
         */
        protected static function html( array $data )
        {
            ?>
<!doctype html>
<title><?php bloginfo( \'name\' ); ?></title>
<meta name="viewport" content="width=device-width; initial-scale=1.0">
<?php
// Just a sample style. Be creative! :)
?>
<style>
body, body *
{
    display:         block;
    font:            1em/1.4 Calibri, sans-serif;
    list-style:      none;
    margin:          0;
    padding:         0;
    text-decoration: none;
}
a
{
    background:      #f5f5f5;
    border-bottom:   1px solid #ddd;
    color:           #333;
    padding:         5px 10px;
}
a:hover, a:focus
{
    background:      #333;
    color:           #f5f5f5;
}
h1 a
{
    font-size:      1.2em;
    font-weight:    bold;
}
</style>
<h1><a href="<?php bloginfo( \'url\' ); ?>"><?php bloginfo( \'name\' ); ?></a></h1>
<ul>
<?php
foreach ( $data as $post )
{
    print \'<li><a href="\' . $post[\'url\'] . \'">\' . $post[\'title\'] . \'</a></li>\';
}
?>
</ul>
<?php
        }
这就是theme test data:

enter image description here

现在我们的产出已经完成了——我们仍在render() – 我们打电话exit 因为否则WordPress会包括index.php 从活动主题。

现在,我们只需要一种方法来刷新永久链接设置:

    /**
     * Reset permalinks.
     *
     * @wp-hook \'activate_\' . __FILE__
     * @wp-hook \'deactivate_\' . __FILE__
     * @return  void
     */
    public static function flush_rewrite_rules()
    {
        remove_action( \'init\', array ( __CLASS__, \'init\' ) );
        add_action( \'init\', \'flush_rewrite_rules\', 11 );
    }
我们防止违约init 钩住这里,因为激活时我们在插件列表中,不需要端点,停用时我们不想重新注册现在未使用的永久链接。

我们通过以下方式将此方法附加到(取消)激活:

// refresh permalink settings
register_activation_hook(
    __FILE__ ,
    array ( \'T5_Random_Posts_Endpoint\', \'flush_rewrite_rules\' )
);
register_deactivation_hook(
    __FILE__ ,
    array ( \'T5_Random_Posts_Endpoint\', \'flush_rewrite_rules\' )
);
现在我们可以说:仅此而已。真正地

如果你能做到这一点complete plugin from GitHub.

SO网友:Ruturaj

我认为本质上你所说的是一个自定义小部件,它将解析和显示你博客的RSS提要。在这里,您可以构建自己的自定义小部件,并在小部件PHP中硬编码博客的RSS提要URL,以确保小部件用户不会更改URL;因此,您的小部件将只显示您博客的RSS。

现在,一旦你最终决定使用RSS来创建你的博客,你面前就有几个选择。您可以使用Wordpress自己的RSS提要功能来节省时间(但这会带来许多限制),也可以编写自己的RSS提要生成器代码,作为安装在服务器/Web主机上的Web服务,与您的小部件进行交互。因此,让您的小部件PHP向您博客的RSS提要发布Web服务发送请求;然后解析服务器返回的结果并显示RSS提要项。

如果您有时间投资并认真对待这个小部件,那么您最好实现自己的Web服务。我不认为这对你来说太难了。。。只需使用WP\\u查询并以正确的RSS提要XML格式返回结果。通过这种方式,您还可以在下拉列表中为您的小部件用户提供类别列表以供选择,并使您的小部件PHP仅从您博客的选定类别请求文章的RSS。此外,您还可以更好地控制小部件请求的RSS提要中返回的帖子数量。

我希望这有帮助。

干杯

Ruturaaj。

结束

相关推荐

Widgets in PHP files?

有没有可能让Wordpress上的每个小部件都以不同的方式运行。php文件我有一个包含12个元素的页面,我想让每个元素都成为一个小部件,以便以后更容易管理/编辑它们,但如果它来自php页面,而不是来自管理面板上的代码块,则会更好。