创建小工具-要求在管理面板中选择帖子

时间:2016-03-27 作者:Mathilde

首先,对我的英语感到抱歉,我会尽量让它可以理解。我是WordPress的新手;我已经创建了一些插件,但它们不需要管理员配置。现在,我想制作另一个创建小部件的小部件,管理员可以从下拉列表中选择自定义帖子类型的帖子。我有一个自定义帖子类型“event type 1”和另一个“event type 2”,我正在尝试创建一个下拉列表,列出这两种帖子类型的帖子。

我想请求在下拉列表中列出所有帖子,然后保存该帖子的ID。但我不确定这是否是一种好的方式,我甚至不确定如何在Wordpress中做到这一点。

如果有人对此有任何建议,我将不胜感激。

现在,这是一个来自教程的简单小部件。我会改变显示,以获得我想要的帖子的信息,我必须添加下拉列表来选择帖子。当前代码如下:

// Creating the widget 
class event_widget extends WP_Widget {

    function __construct() {
        parent::__construct(
            // Base ID of your widget
            \'event_widget\', 

            // Widget name will event_widgetappear in UI
            __(\'Event Widget\', \'my_event_widget\'), 

            // Widget description
            array( \'description\' => __( \'Event Widget\', \'my_event_widget\' ), )
        );
    }

    public function widget( $args, $instance ) {
        $title = apply_filters( \'widget_title\', $instance[\'title\'] );

        echo $args[\'before_widget\'];

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

        echo __( \'Hello, World!\', \'my_event_widget\' );
        echo $args[\'after_widget\'];
    }


    public function form( $instance ) {    
        if ( isset( $instance[ \'title\' ] ) ) {
            $title = $instance[ \'title\' ];
        }
        else {
            $title = __( \'New title\', \'my_event_widget\' );
        }
        ?>
        <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 esc_attr( $title ); ?>" />
        </p>
        <?php 

    }

    public function update( $new_instance, $old_instance ) {
        $instance = array();
        $instance[\'title\'] = ( ! empty( $new_instance[\'title\'] ) ) ? strip_tags( $new_instance[\'title\'] ) : \'\';

        return $instance;
    }

}

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

1 个回复
SO网友:engelen

首先,尝试处理代码格式。事实上,它很难阅读,这不仅让我们更难理解如何帮助您,而且也不太容易扩展,不适合将来使用。始终尝试遵守WordPress PHP Coding 标准。

现在,让我们来谈谈问题的症结所在。。。

要向小部件添加新设置,必须在现有类的两类方法中实现功能:form()update(). 在里面form(), 我们将显示post下拉列表update(), 我们将保存选定的帖子。

显示下拉列表

要显示下拉列表,我们使用WP_Query, 它创建一个用于获取所有帖子的查询。我们将此代码放置在form 在实际显示任何内容之前。下面的代码获取所有(posts_per_page=1) 来自帖子类型的帖子和页面(post_type=post,page), 按标题排序(orderby=post_title) 上升的(order=ASC). 生成的帖子存储在属性中$posts_query->posts.

$posts_query = new WP_Query( array(
    \'post_type\' => array( \'post\', \'page\' ), // Replace by your posts types for event type 1 and 2
    \'posts_per_page\' => -1,
    \'orderby\' => \'post_title\',
    \'order\' => \'ASC\'
) );
接下来,我们在form() 方法,只需在找到的帖子上循环。

<p>
    <label for="<?php echo $this->get_field_id( \'post\' ); ?>"><?php _e( \'Post\' ); ?></label>
    <select name="<?php echo $this->get_field_name( \'post\' ); ?>" id="<?php echo $this->get_field_id( \'post\' ); ?>" class="widefat">
        <?php foreach ( $posts_query->posts as $post ) : ?>
            <option value="<?php echo $post->ID; ?>" <?php selected( $post->ID, $instance[\'post\'] ); ?>>
                <?php echo $post->post_title; ?>
            </option>
        <?php endforeach; ?>
    </select>
</p>
试着理解上面的代码,因为您将来需要它来创建更多的小部件选项!

现在,我们使用update() 方法在有人保存小部件时保存所选帖子。为此,只需在$instance 已返回。

$instance[\'post\'] = $new_instance[\'post\'];
这会将新帖子添加到将用于更新实例的实例数组中。

这应该足够了

。。在路上帮助你。祝您在小部件中显示帖子好运!

相关推荐

为什么当我浏览网站的wp-admin页面时,广告页面会打开?

当我尝试通过Wordpress编辑我的网站并在登录后打开任何Wordpress页面时,该页面显示一个广告页面,我无法编辑我的网站。当我试图编辑任何帖子或打开wordpress的仪表板时,广告不断出现,但在实际的网站上没有显示。如何删除它并编辑网站?非常感谢。