web-dev-qa-db-fra.com

empêcher la publication de plusieurs catégories dans mon plugin

J'écris un plugin, je veux éviter que les articles aient plusieurs catégories (c'est-à-dire le même produit ayant les catégories "Samsung" et "Apple") . Avez-vous une idée de la façon d'utiliser certaines actions/filtres pour y parvenir à l'aide de mon plug-in?

2
Shafiul

Essayez le code suivant. Cela permettrait de convertir les cases à cocher de taxonomie de catégorie en boutons radio. De cette façon, une seule catégorie peut être sélectionnée.

add_filter('wp_terms_checklist_args', 'wpse_64691_one_category_only', '', 2);
function wpse_64691_one_category_only( $args, $post_id){
    $args['walker'] = new WPSE_64691_Category_Radio;
    return $args;
}

class WPSE_64691_Category_Radio extends Walker {
    var $tree_type = 'category';
    var $db_fields = array ('parent' => 'parent', 'id' => 'term_id'); //TODO: decouple this

    function start_lvl( &$output, $depth = 0, $args = array() ) {
            $indent = str_repeat("\t", $depth);
            $output .= "$indent<ul class='children'>\n";
    }

    function end_lvl( &$output, $depth = 0, $args = array() ) {
            $indent = str_repeat("\t", $depth);
            $output .= "$indent</ul>\n";
    }

    function start_el( &$output, $category, $depth, $args, $id = 0 ) {
            extract($args);
            if ( empty($taxonomy) )
                    $taxonomy = 'category';

            if ( $taxonomy == 'category' )
                    $name = 'post_category';
            else
                    $name = 'tax_input['.$taxonomy.']';

            $class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
            if ( $taxonomy == 'category' )
                $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->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>';
            else
                $output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" 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 = 0, $args = array() ) {
            $output .= "</li>\n";
    }
}
2
Joshua Abenazer

Il y a des plugins jQuery qui changent les cases de catégories en boutons radio Création de boutons radio de sélection de catégories . Ce n'est cependant pas une solution pure et sûre. Ce que vous pouvez faire, c'est utiliser

add_action('publish_post', 'your_function');

Faites un var_dump dans votre fonction pour voir ce qui se passe réellement. Ensuite, vous verrez également s’il existe plus que la catégorie cochée.

function your_function($content){
  var_dump($content);

  //Check if more than one category is checked, return false and don't publish
}

Vous pouvez également consulter: Exécution d’une fonction dans Wordpress lors de la publication d’un type de publication personnalisé

1
jocken