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


11

J'ai utilisé des champs personnalisés avancés pour créer des champs personnalisés pour le nom du concours, les réponses, etc. J'ai créé un type de message personnalisé pour les concours comme indiqué sur l'image et j'ai utilisé Wordpress functions.php pour créer les colonnes à partir des valeurs de mes champs personnalisés.

J'essaie d'obtenir une zone de liste déroulante "Filtrer par" avec les différents noms / libellés des concours, 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 je n'ai utilisé que des champs personnalisés pour tout le reste.

Est-il possible de créer une liste déroulante "Filtrer par" personnalisée en utilisant uniquement des champs personnalisés?

Filtre Wordpress par


Vous pouvez utiliser le restrict_manage_postscrochet d'action pour ajouter des boîtes déroulantes supplémentaires. N'oubliez pas que vous devrez également ajouter une certaine logique au filtre, car WP ne saura pas quoi en faire dès la sortie de la boîte (contrairement aux listes déroulantes de taxonomie, qu'il peut gérer automatiquement).
David Gard

Comme réflexion supplémentaire - si vous le souhaitez, vous pouvez créer un lien vers le nom dans votre tableau de liste, ce qui signifie que vous pouvez filtrer un concours en cliquant sur le nom, plutôt que d'avoir une liste déroulante.
David Gard

Réponses:


12

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 du concours comme meta_key et" nom du concours "comme nom déroulant sélectionné.


Sympa, je me sentais paresseux alors je lui ai suggéré de poser une question supplémentaire;)
David Gard

On dirait que les 2 réponses sont une réponse complète et doivent être combinées.
RCNeil

10

L' action restrict_manage_posts déclenche la add_extra_tablenav()fonction, c'est-à-dire comment vous ajoutez des listes déroulantes supplémentaires à la table de liste souhaitée.

Dans l'exemple ci-dessous, nous nous assurons d'abord que le type de publication est correct, puis nous récupérons toutes les valeurs de base de données stockées par rapport à la competition_nameclé dans la postmetatable (vous devez modifier le nom de la clé comme requis). La requête est assez basique et vérifie uniquement si le concours est publié, ne prend que des valeurs uniques (vous ne voulez pas de duplication dans la liste déroulante), puis les classe par ordre alphabétique.

Ensuite, nous vérifions les résultats (aucun point de sortie de la liste déroulante pour rien), puis construisons les options (y compris un defualt pour tout afficher). Enfin, la liste déroulante est sortie.

Comme indiqué dans mon commentaire, ce n'est pas la fin de l'histoire cependant; vous aurez besoin d'un peu de logique pour dire au tableau de liste d'afficher uniquement les résultats souhaités lorsque le filtre est actif, mais je vous laisse y jeter un œil, puis commencer une autre question si vous avez besoin d'aide. Astuce - extraire le fichier /wp-admin/includes/class-wp-posts-list-table.phpet 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;

    // get selected option if there is one selected
    if (isset( $_GET['competition-name'] ) && $_GET['competition-name'] != '') {
        $selectedName = $_GET['competition-name'];
    } else {
        $selectedName = -1;
    }

    /** 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) :
        if ($result == $selectedName) {
            $options[] = sprintf('<option value="%1$s" selected>%2$s</option>', esc_attr($result), $result);
        } else {
            $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>';

}

Lorsque j'utilise ceci, j'obtiens l'erreurNotice: wpdb::prepare was called incorrectly. The query does not contain the correct number of placeholders (6) for the number of arguments passed (5). Please see Debugging in WordPress for more information. (This message was added in version 4.8.3.) in /[...]/wp-includes/functions.php on line 4773
rassoh

Je reçois également la même erreur
Vasim Shaikh

0

Si cela ne fonctionne pour personne, ma solution devait ajouter la colonne sur laquelle je tentais de filtrer à la liste des colonnes triables pour mon type de publication personnalisé.

// Make Custom Post Type Custom Columns Sortable
function cpt_custom_columns_sortable( $columns ) {

    // Add our columns to $columns array
    $columns['item_number'] = 'item_number';
    $columns['coat_school'] = 'coat_school'; 

    return $columns;
} add_filter( 'manage_edit-your-custom-post-type-slug_sortable_columns', 'cpt_custom_columns_sortable' );

0

Remplacez la requête ci-dessous pour corriger l'erreur wpdb: prepare:

$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,
        'competition_name' //this is needed a second time to define "%3$s" in ORDER BY
  );
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.