自定义标签云小部件缺少标签

时间:2014-11-20 作者:Raunak Hajela

我试图创建一个自定义标记云小部件,该小部件如下所示:

enter image description here

此外,当我尝试在帖子中添加一些新标签时,它会显示如下内容(只有一个标签):

enter image description here

这是我的functions.php

if(function_exists(\'register_sidebar\')) {

    register_sidebar(
    array(
         \'name\' => __(\'Main Sidebar\'),
         \'id\' => \'main-sidebar\',
         \'description\' => __(\'The main sidebar area\'),
         \'before_widget\' => \'<div class="widget">\',
         \'after_widget\' => \'</div>\',
         \'before_title\' => \'<h2>\',
         \'after_title\' => \'</h2>\'
   ));

}

/****************************************************/
/* Load Custom Widgets */  
/***************************************************/

require_once(\'functions/rh_tags.php\');
这是我的rh_tags.php

<?php 
class RH_Tags extends WP_Widget {
    function __construct() {
        $params = array(
            \'name\' => \'Creative : Tag Cloud Widget\',
            \'description\' => \'Displays info of your blog\'
            );
        parent:: __construct(\'RH_Tags\',\'\',$params);
    }

    public function form($instance) {
        //display our form in widget page
        extract($instance);
        ?>
        <p>
            <label for="<?php echo $this->get_field_id(\'title\') ?>">Title : </label>
            <input class="widefat" id="<?php echo $this->get_field_id(\'title\') ?>" name="<?php echo $this->get_field_name(\'title\') ?>" 
            value="<?php if(isset($title)) echo esc_attr($title); ?>" />
        </p>
        <?php
    }

    public function widget($args,$instance) {
        //displays our widget
        extract($args);
        extract($instance);
        echo $before_widget;
           echo $before_title .$title. $after_title;
           echo \'<div class="label">\';
           echo "<ul>";
                echo "<li>";
                echo the_tags(\' \',\' \');
                echo "</li>";
                echo "</ul>";
           echo \'</div>\';
        echo $after_widget;
    }
} 

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

1 个回复
SO网友:kaiser

你有哪些标签/术语/分类

Thethe_tags( $before = null, $sep = \', \', $after = \'\' ) 函数是的包装器get_the_tag_list( $before = \'\', $sep = \'\', $after = \'\', $id = 0 ).

此功能应用过滤器the_tagsget_the_term_list( 0, \'post_tag\', $before = \'\', $sep = \'\', $after = \'\' ) (0$id$post_tag 这个$taxonomy 参数)的post_tag 并返回它。和get_the_term_list() 负责获取标记并构建标记。

为了获取术语,它使用get_the_terms( $id, $taxonomy ) 内部。如果查看这些函数的内部结构(请参见链接),它将使用get_post() 如果否$id 已提供。

这表明您总是只能获得单个帖子的标签/术语。为了说明这一点,下面是get_the_terms( $id, $taxonomy ) 功能:

function get_the_terms( $post, $taxonomy ) {
    if ( ! $post = get_post( $post ) )
        return false;

    $terms = get_object_term_cache( $post->ID, $taxonomy );
    if ( false === $terms ) {
        $terms = wp_get_object_terms( $post->ID, $taxonomy );
        wp_cache_add($post->ID, $terms, $taxonomy . \'_relationships\');
    }
正如您所看到的,这些包装器中的第二个函数已经没有提供ID,因此它返回到ID0. 这使得if回到global $post/\\WP_Post 对象,它是来自主查询的对象(其中\\WP_Query->current_post 指向)。这可能是很多。首先,它是主查询循环中的第一篇帖子,按照默认值运行。然后,如果循环后查询没有重置,则是最后一篇文章,等等。如果您稍后有循环,例如由插件或主题完成,则是另一篇文章,等等。

Conclusion: 如果您退回到全局post对象,那么您正在使用全局(不可靠)提供给您的内容。

我建议使用get_terms() 相反,它的输出更容易控制,并且不依赖于使用帖子中的数据,这是您不想要的。

其他注意事项

为什么不使用extract()? 因为

IDE(如PHPStorm、Sublime、Aptana等)不识别来源/内容empty() 或isset():

public function( Array $args )
{
    $foo = isset( $args[\'foo\'] )
        ? $args[\'foo\']
        : \'my default\';
    // work with `$foo`

结束

相关推荐

Dynamic Width of Widgets

好的,我在一个侧边栏中为最多6个小部件使用以下代码function s57d_sidebar1_params($params) { $sidebar_id = $params[0][\'id\']; if ( $sidebar_id == \'sidebar-1\' ) { $total_widgets = wp_get_sidebars_widgets(); $sidebar_widgets = count($total_wi