web-dev-qa-db-fra.com

Comment faire une méta-boîte de catégories avec des cases à cocher hiérarchiques sur Frontend?

Mon site Web permet aux utilisateurs de publier des messages d'un type de message personnalisé ("lieu").

J'aimerais afficher la même boîte méta "Catégories" dans le tableau de bord WordPress lorsque vous ajoutez ou modifiez une publication sur le front-end:
backend categories meta box

En effet, la méta-boîte "Catégories" ou les cases à cocher hiérarchiques constituent tout simplement le meilleur moyen d'afficher et de modifier les catégories auxquelles un message appartient.

Comment puis-je la méta-boîte "Catégories" sur l'interface?

Je connais JQuery, alors n'hésitez pas à ajouter des étoffes JQuery, le cas échéant. Je préférerais fortement une approche pour reproduire ce que WordPress fait pour ajouter/éditer une publication dans le backend, au lieu d'un hack à partir de zéro.

3
ericn

Essayez wp_terms_checklist() / wp_category_checklist. Il va générer une liste de cases à cocher nommée post_category.

Vous devrez peut-être également inclure le fichier source , car il est défini dans les fichiers d’administration.

Ou utilisez un marcheur personnalisé:

class MyCategoryWalker extends Walker_Category{

  public function start_el(&$output, $term, $depth, $args){

    $args = wp_parse_args(array(
      'name'    => 'my_category_input',
      'checked' => array(),

    ), $args);

    extract($args);

    $checked = checked(in_array($term->term_id, $checked));

    ob_start(); ?>   

    <li>
      <input type="checkbox" <?php $checked; ?> id="category-<?php print $term->term_id; ?>" name="<?php print $name; ?>[]" value="<?php print $term->term_id; ?>" />
      <label for="category-<?php print $term->term_id; ?>">
        <?php print esc_attr($term->name); ?>
      </label>       

    <?php // closing LI is added inside end_el

    $output .= ob_get_clean();
  }
}

Utilisez-le comme:

wp_list_categories(array(
  'walker'   => new MyCategoryWalker(),
  'name'     => 'my_category_input',       // name of the input
  'selected' => array(2, 5, 10),           // checked items (category IDs)
));
3
onetrickpony