WordPress小工具的多项选择

时间:2018-08-04 作者:wpdev

我创建了自己的类别选择小部件。所以我用<select> 但我想和multiple 属性

这是我的widget类。它在没有multiple 属性。但我想用它。并且它必须是数组中的返回类别ID。

<?php

class myCatWidget extends WP_Widget {

    function myCatWidget() {
        parent::WP_Widget( false, $name = \'My cat widget\' );
    }

    function form( $instance ) {
        $title = esc_attr( $instance[ \'title\' ] );
        $postCats = $instance[ \'postCats\' ];
        ?>

        <p>
            <label for="<?php echo $this->get_field_id( \'title\' ); ?>">Title</label>
            <input type="text" class="widfat" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" style="width: 100%;" value="<?php echo $title; ?>"/>
        </p>

        <p>
            <label for="<?php echo $this->get_field_id( \'postCats\' ); ?>">Categories</label>
            <select name="<?php echo $this->get_field_name( \'postCats\' ); ?>" id="<?php echo $this->get_field_id( \'postCats\' ); ?>" style="width: 100%;" multiple>
                <?php
                $args = array(
                    \'taxonomy\' => \'category\',
                );

                $terms = get_terms( $args );
                foreach( $terms as $term ) { ?>
                    <option <?php selected( $instance[ \'postCats\' ], $term->term_id ); ?> value="<?php echo esc_attr( $term->term_id ); ?>">
                        <?php echo esc_html( $term->name ); ?>
                    </option>
                <?php } ?>
            </select>
        </p>

        <?php

    }

    function update( $new_instance, $old_instance ) {
        $instance = $old_instance;

        $instance[ \'title\' ] = strip_tags( $new_instance[ \'title\' ] );
        $instance[ \'postCats\' ] = esc_sql( $new_instance[ \'postCats\' ] );
        return $instance;
    }

    function widget( $args, $instance ) {
        extract( $args );

        $title = apply_filters( \'widget_title\', $instance[ \'title\' ] );
        $postCats = $instance[ \'postCats\' ];

        echo $before_widget;

        if( $title ) {
            echo $before_title . $title . $after_title;
        }

        echo $postCats;

        echo $after_widget;
    }
}

add_action( \'widgets_init\', create_function( \'\', \'return register_widget("myCatWidget");\' ) );

?>

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

嗨,为什么不使用多个复选框而不是选择选项字段呢。此外,您还使用了不推荐使用的函数,如“create\\u function”。我修改了您的代码,将选择选项替换为多个复选框选择。

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

class my_custom_cat_widget extends WP_Widget {

   function __construct() { 
        parent::__construct(\'my_custom_cat_widget\', __(\'My cat widget\', \'wpb_widget_domain\'), 
            array( \'description\' => __( \'Your description\', \'wpb_widget_domain\' ), ) 
        );
    }

public function form( $instance ) {
    $title = isset($instance[ \'title\' ]) ? $instance[ \'title\' ] : \'Categories\';
    $instance[\'postCats\'] = !empty($instance[\'postCats\']) ? explode(",",$instance[\'postCats\']) : array();
    ?>

    <p>
        <label for="<?php echo $this->get_field_id( \'title\' ); ?>">Title</label>
        <input type="text" class="widfat" id="<?php echo $this->get_field_id( \'title\' ); ?>" name="<?php echo $this->get_field_name( \'title\' ); ?>" style="width: 100%;" value="<?php echo $title; ?>"/>
    </p>

    <p>
        <label for="<?php echo $this->get_field_id( \'postCats\' ); ?>"><?php _e( \'Select Categories you want to show:\' ); ?></label><br />
        <?php $args = array(
                \'post_type\' => \'post\',
                \'taxonomy\' => \'category\',
            );
            $terms = get_terms( $args );
        //print_r($terms);
         foreach( $terms as $id => $name ) { 
            $checked = "";
            if(in_array($name->name,$instance[\'postCats\'])){
                $checked = "checked=\'checked\'";
            }
        ?>
            <input type="checkbox" class="checkbox" id="<?php echo $this->get_field_id(\'postCats\'); ?>" name="<?php echo $this->get_field_name(\'postCats[]\'); ?>" value="<?php echo $name->name; ?>"  <?php echo $checked; ?>/>
            <label for="<?php echo $this->get_field_id(\'postCats\'); ?>"><?php echo $name->name; ?></label><br />
        <?php } ?>
    </p>

    <?php

}

public function update( $new_instance, $old_instance ) {
    $instance = $old_instance;

    $instance[ \'title\' ] = strip_tags( $new_instance[ \'title\' ] );
    $instance[\'postCats\'] = !empty($new_instance[\'postCats\']) ? implode(",",$new_instance[\'postCats\']) : 0;
    return $instance;
}

public function widget( $args, $instance ) {
    extract( $args );

    $title = apply_filters( \'widget_title\', $instance[ \'title\' ] );
    $postCats = $instance[ \'postCats\' ];
    $categories_list = explode(",", $postCats);

    echo $before_widget;

    if( $title ) {
        echo $before_title . $title . $after_title;
    }

    $args = array(\'post_type\' => \'post\',\'taxonomy\' => \'category\',);
    $terms = get_terms( $args );
    ?>
    <ul>
        <?php
            foreach ($categories_list as $cat) {
                foreach($terms as $term) {
                    if($cat === $term->name) {
                        echo "<li>".$term->name."</li>";                                    
                    }
                }
            }
        ?>
    </ul>
    <?php
    echo $after_widget;
}
}
希望这将有助于解决您的问题。:)

SO网友:Matteus Barbosa

易于理解的在选择名称后面加两个括号,如

name="<?php echo $this->get_field_name( \'postCats\' ); ?>"
将命名为

name="<?php echo $this->get_field_name( \'postCats\' ); ?>[]"
然后将按预期返回完整的选项数组。

结束

相关推荐

menu customization

我正在我的页面上使用高级主题。该主题在整个站点中只接受一个菜单。该网站是一个单页网站。主题的工作方式是,我们必须建立一个主页,然后使用菜单项来制作网站的各个部分。因此,我创建了一个菜单,其中包含我想要的所有部分,使用我创建的页面已经设置为部分。例如:我有主页、照片、视频等。这些都是单独的页面,但当我将它们作为菜单的一部分时,它们将在一个页面中显示在另一个页面的下方,菜单项将滚动到该页面上的锚定位置。许多主题都是这样工作的。My problem is :我需要翻译菜单或设置另一个页面(不是作为节,而是一个正