web-dev-qa-db-fra.com

Filtrer par champ personnalisé dans le type de publication personnalisé sur la page d'administration

J'ai utilisé Advanced Custom Fields pour créer des champs personnalisés pour le nom de la compétition, les réponses, etc. J'ai créé un type de publication personnalisé pour les compétitions, comme indiqué sur l'image, ainsi que Wordpress functions.php pour créer les colonnes à partir des valeurs de mes champs personnalisés.

J'essaie d'obtenir une boîte déroulante "Filtrer par" avec les noms/libellés des compétitions, comme indiqué ci-dessous, mais je ne peux trouver des solutions qu'en utilisant des taxonomies, que je préfère ne pas utiliser si possible car Nous n’avons utilisé que des champs personnalisés pour tout le reste.

Est-il possible de créer un menu déroulant "Filtrer par" personnalisé en utilisant uniquement des champs personnalisés?

 Wordpress filter by 

9
grAND

Et pour afficher le résultat du filtre, essayez ce code

add_filter( 'parse_query', 'prefix_parse_filter' );
function  prefix_parse_filter($query) {
   global $pagenow;
   $current_page = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

   if ( is_admin() && 
     'competition' == $current_page &&
     'edit.php' == $pagenow && 
      isset( $_GET['competition-name'] ) && 
      $_GET['competition-name'] != '') {

    $competion_name = $_GET['competition-name'];
    $query->query_vars['meta_key'] = 'competition_name';
    $query->query_vars['meta_value'] = $competition_name;
    $query->query_vars['meta_compare'] = '=';
  }
}

Modifiez la clé méta et la valeur méta selon vos besoins. J'ai pris "nom de compétition comme méta_key et" nom de compétition "comme nom déroulant choisi.

11
Aftab

L'action (restrict_manage_posts} déclenche la fonction add_extra_tablenav(), qui permet d'ajouter des listes déroulantes à la liste souhaitée.

Dans l'exemple ci-dessous, nous nous assurons d'abord que le Type de message est correct, puis nous récupérons toutes les valeurs de base de données stockées avec la clé competition_name dans la table postmeta (vous devez modifier le nom de la clé si nécessaire). La requête est assez basique et vérifie uniquement si le Competition _ est publié, prend uniquement des valeurs uniques (vous ne voulez pas de duplication dans le menu déroulant), puis les ordonne par ordre alphabétique.

Ensuite, nous vérifions les résultats (aucun point n’affiche la liste déroulante pour rien), puis nous construisons les options (y compris un défaut de tout afficher). Enfin, la liste déroulante est affichée.

Comme indiqué dans mon commentaire, ce n’est pas la fin de l’histoire; vous aurez besoin d'un peu de logique pour indiquer à la table des listes de ne montrer que les résultats souhaités lorsque le filtre est actif, mais je vous laisserai jeter un coup d'œil à cela, puis poserai une autre question si vous avez besoin d'aide. Indice - extrayez le fichier /wp-admin/includes/class-wp-posts-list-table.php et son parent .../wp-class-list-table.php

/**
 * Add extra dropdowns to the List Tables
 *
 * @param required string $post_type    The Post Type that is being displayed
 */
add_action('restrict_manage_posts', 'add_extra_tablenav');
function add_extra_tablenav($post_type){

    global $wpdb;

    /** Ensure this is the correct Post Type*/
    if($post_type !== 'competition')
        return;

    /** Grab the results from the DB */
    $query = $wpdb->prepare('
        SELECT DISTINCT pm.meta_value FROM %1$s pm
        LEFT JOIN %2$s p ON p.ID = pm.post_id
        WHERE pm.meta_key = "%3$s" 
        AND p.post_status = "%4$s" 
        AND p.post_type = "%5$s"
        ORDER BY "%3$s"',
        $wpdb->postmeta,
        $wpdb->posts,
        'competition_name', // Your meta key - change as required
        'publish',          // Post status - change as required
        $post_type
    );
    $results = $wpdb->get_col($query);

    /** Ensure there are options to show */
    if(empty($results))
        return;

    /** Grab all of the options that should be shown */
    $options[] = sprintf('<option value="-1">%1$s</option>', __('All Competitions', 'your-text-domain'));
    foreach($results as $result) :
        $options[] = sprintf('<option value="%1$s">%2$s</option>', esc_attr($result), $result);
    endforeach;

    /** Output the dropdown menu */
    echo '<select class="" id="competition-name" name="competition-name">';
    echo join("\n", $options);
    echo '</select>';

}
9
David Gard