Как использовать радио-кнопки для выбора категории

Как использовать радио-кнопки для выбора категории | n-wp.ru
Два способа смены чекбоксов на радио-кнопки при написании поста и выборе категории. Первый - для вебмастеров, самостоятельно создающих форму или страницу для публикации записи. Второй - станадртный, в виде плагина, меняющего чекбоксы на радио-кнопки в редакторе.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

Как использовать радио-кнопки для выбора категории

Если у вас в блоге пользователи могут публиковать записи, то наверняка вы, как администратор, сталкивались с проблемой неправильного указания ими нескольких категорий вместо одной. Да, это иногда бывает проблемой, и, прежде чем перейти к дальнейшему описанию, позволю себе небольшое лирическое отступление, проясняющее ситуацию.

В некоторых странах на особо оживленных, потенциально опасных участках дорог, водителю и в голову не придет выехать на встречную полосу движения и двигаться по ней. А знаете почему? Потому что такой возможности у него просто нет – вместо двойной сплошной линии идет бетонное ограждение метровой высоты. Хочешь или не хочешь, но придется ехать по своему участку дороги, и даже если водитель и задумал нарушить правила, и тем самым создать опасную ситуацию на дороге, он сделать этого не сможет.

Я это к чему пишу? Иногда сознательное ограничение свободы выбора играет положительную роль. Не всегда стоит полагаться на сознательность пользователей, а если уж быть до конца честным, то и вовсе не стоит полагаться на сознательность пользователей. Потому что пояснения и документацию они читают только в самую последнюю очередь, и если есть возможность сделать не так, как надо, то будьте уверены – будут делать именно так, как не нужно, а вы будете все это за ними исправлять.

Так и в форме публикации записи в этом блоге было – до тех, пока у пользователей был свободный выбор, какую категорию указать, не смотря на предупредительную запись, сообщающую, что нужно указывать только одну категорию, больше половины записей пользователей шло на проверку с двумя, а иногда и тремя категориями. И только внедрение радио-кнопок вместо чекбоксов в форму выбора категории позволило исправить эту ситуацию.

Радио-кнопка – это тот же самый чекбокс, но выбрать можно только одну позицию. Этим замечательным свойством пользуются, когда хотят сознательно ограничить выбор только одной позицией из нескольких. Для меня это свойство оказалось востребованным в форме публикации. Если и вам нужна такая возможность, то делюсь рецептом смены чекбоксов при выборе категории на радио-кнопки.

В файл functions.php добавьте функции формирования списка категории в виде радио-кнопок:

if(!class_exists('Walker_Category_Radiolist')){
class Walker_Category_Radiolist extends Walker {
    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id');
 
    function start_lvl(&$output, $depth, $args) {
        $indent = str_repeat("t", $depth);
        $output .= "$indent<ul class='children'>n";
                
    }
 
    function end_lvl(&$output, $depth, $args) {
        $indent = str_repeat("t", $depth);
        $output .= "$indent</ul>n";
                
    }
 
    function start_el(&$output, $category, $depth, $args) {
        extract($args);
        if ( empty($taxonomy) )
            $taxonomy = 'category';
 
        if ( $taxonomy == 'category' )
            $name = 'post_category';
        else
                        $name = $taxonomy;
            
 
        $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
        $output .= "n<li>term_id}'$class>" . '<label class="selectit">term_id . '" type="radio" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
    }
 
    function end_el(&$output, $category, $depth, $args) {
        $output .= "</li>n";
    }
}
}

if(!function_exists('wp_category_radiolist')){
function wp_category_radiolist( $post_id = 0, $descendants_and_self = 0, $selected_cats = false, $popular_cats = false, $walker = null, $checked_ontop = true ) {
        wp_terms_radiolist($post_id,
            array(
                    'taxonomy' => 'category',
                    'descendants_and_self' => $descendants_and_self,
                    'selected_cats' => $selected_cats,
                    'popular_cats' => $popular_cats,
                    'walker' => $walker,
                    'checked_ontop' => $checked_ontop
        ));
    }
}

if(!function_exists('wp_terms_radiolist')){
function wp_terms_radiolist($post_id = 0, $args = array()) {
    $defaults = array(
        'descendants_and_self' => 0,
        'selected_cats' => false,
        'popular_cats' => false,
        'walker' => null,
        'taxonomy' => 'category',
        'checked_ontop' => false
    );
    extract( wp_parse_args($args, $defaults), EXTR_SKIP );
 
    if ( empty($walker) || !is_a($walker, 'Walker') )
        $walker = new Walker_Category_Radiolist;
 
    $descendants_and_self = (int) $descendants_and_self;
 
    $args = array('taxonomy' => $taxonomy);
 
    $tax = get_taxonomy($taxonomy);
    $args['disabled'] = !current_user_can($tax->cap->assign_terms);
 
    if ( is_array( $selected_cats ) )
        $args['selected_cats'] = $selected_cats;
    elseif ( $post_id )
        $args['selected_cats'] = wp_get_object_terms($post_id, $taxonomy, array_merge($args, array('fields' => 'ids')));
    else
        $args['selected_cats'] = array();
 
    if ( is_array( $popular_cats ) )
        $args['popular_cats'] = $popular_cats;
    else
        $args['popular_cats'] = get_terms( $taxonomy, array( 'fields' => 'ids', 'orderby' => 'count', 'order' => 'DESC', 'number' => 10, 'hierarchical' => false ) );
 
    if ( $descendants_and_self ) {
        $categories = (array) get_terms($taxonomy, array( 'child_of' => $descendants_and_self, 'hierarchical' => 0, 'hide_empty' => 0 ) );
        $self = get_term( $descendants_and_self, $taxonomy );
        array_unshift( $categories, $self );
    } else {
        $categories = (array) get_terms($taxonomy, array('get' => 'all'));
    }
 
    if ( $checked_ontop ) {

        $checked_categories = array();
        $keys = array_keys( $categories );
 
        foreach( $keys as $k ) {
            if ( in_array( $categories[$k]->term_id, $args['selected_cats'] ) ) {
                $checked_categories[] = $categories[$k];
                unset( $categories[$k] );
            }
        }
 

        echo call_user_func_array(array(&$walker, 'walk'), array($checked_categories, 0, $args));
    }

    echo call_user_func_array(array(&$walker, 'walk'), array($categories, 0, $args));
}
}

Этот код – это набор функций, формирующих список категорий. Если какая-то радио-кнопка выбрана, то этот выбор запоминается. Теперь осталось использовать в нужном месте список категорий, выбор между которыми осуществляется радио-кнопками:

<ul>
     'category') ); ?>
</ul>

Приведенные выше коды можно использовать, если вы самостоятельно создаете форму или страницу для публикации записей. Если же вы используете стандартные возможности WordPress, и пользователи публикуют записи через админку, то можете применить плагин Radio Button Categories – он делает практически то же самое, меняя в редакторе у списка категорий чекбоксы на радио-кнопки.

Radio Button Categories
Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

×
WordPress:
прокачай свой сайт!

Скидка на премиум темы и плагины

Успей забрать скидку ⋙