Comment faire pour trier la zone d'administration d'un type de poste personnalisé WordPress par un champ personnalisé

wordpress.stackexchange https://wordpress.stackexchange.com/questions/45

  •  16-10-2019
  •  | 
  •  

Question

Lors de l'édition d'un de mes types de postes personnalisés Je veux être en mesure de répertorier toutes les entrées d'un champ personnalisé au lieu de la date de leur publication (qui, pour un type de poste personnalisé est probablement pas pertinent). Je suis un chef de file des commentaires d'un billet de blog sur les types de postes personnalisés et l'auteur dit qu'il était possible et qu'il a même fait de sorte que vous pouvez cliquer sur les noms de colonnes pour une sorte personnalisée. Il a mentionné le posts_orderby fonction que je l'ai noté dans mes commentaires, mais maintenant je peux trouver le billet de blog plus. Aucune suggestion? J'ai vu une solution qui utilise

add_action('wp', 'check_page');

Et la fonction check_page a utilisé add_filter pour changer la requête, mais je suis sûr que cela ne marcherait dans le thème fichiers, pas dans la zone d'administration.

Était-ce utile?

La solution

Comme vous pouvez l'imaginer par l'absence de réponses fournies, la solution est pas tout à fait trivial. Ce que je l'ai fait est de créer un exemple un peu autonome qui suppose un type de poste personnalisé de « movie » et la clé de champ personnalisé de « Genre ».

Disclaimer :. Cela fonctionne avec WP3.0 mais je ne peux pas être sûr qu'il fonctionnera avec les versions antérieures

Vous devez essentiellement accrocher deux (2) crochets pour le faire fonctionner et deux (2) pour la rendre évidente et utile.

Le premier crochet est « restrict_manage_posts » qui vous permet d'émettre un HTML <select> dans la zone au-dessus de la liste des postes où les « Actions en vrac » et « Afficher les dates » filtres. Le code fourni va générer le « Trier par: » fonctionnalité comme on le voit dans cet extrait de l'écran:


(source: mikeschinkel.com )

Le code utilise SQL directe car il n'y a pas une fonction API de WordPress pour fournir la liste de tous les meta_keys pour un type de poste (sons comme un futur le billet TRAC pour moi ...) Quoi qu'il en soit, voici le code. Notez qu'il saisit le type poste de $_GET et valide pour vous assurer qu'il est à la fois un type de poste valide post_type_exists() ainsi que d'être un type de poste de movie (ces deux contrôles sont overkill, mais je l'ai fait pour vous montrer comment si vous ne voulez pas . coder en dur le type de poste) Enfin j'utilise le paramètre d'URL de sortby comme il le fait pas en conflit avec rien d'autre dans WordPress:

add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
    if (isset($_GET['post_type'])) {
        $post_type = $_GET['post_type'];
        if (post_type_exists($post_type) && $post_type=='movie') {
            global $wpdb;
            $sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
            $results = $wpdb->get_results($sql);
            $html = array();
            $html[] = "<select id=\"sortby\" name=\"sortby\">";
            $html[] = "<option value=\"None\">No Sort</option>";
            $this_sort = $_GET['sortby'];
            foreach($results as $meta_key) {
                $default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
                $value = esc_attr($meta_key->meta_key);
                $html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
            }
            $html[] = "</select>";
            echo "Sort by: " . implode("\n",$html);
        }
    }
}

La deuxième étape nécessaire est d'utiliser le crochet parse_query qui est appelé après WordPress décide une requête qui est courrais, mais avant d'exécuter la requête. Ici, nous avons des valeurs ensemble de orderby et meta_key dans le tableau de query_var de la requête qui sont documentées dans le Codex dans le paramètre orderby pour query_posts(). Nous testons pour vous assurer que:

  1. Nous sommes dans l'admin (is_admin()),
  2. Nous sommes sur la page qui répertorie les messages de l'administrateur ($pagenow=='edit.php'),
  3. La page a été appelée avec un paramètre d'URL de post_type égal à movie et
  4. La page a également été appelée avec un paramètre d'URL de sortby et qu'il n'a pas été adopté une valeur de ' Aucun

Si tous ces tests passent Nous avons ensuite le query_vars (comme documenté ) à meta_value et notre valeur sortby pour ' Genre :

add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
    global $pagenow;
    if (is_admin() && $pagenow=='edit.php' &&
        isset($_GET['post_type']) && $_GET['post_type']=='movie' && 
        isset($_GET['sortby'])  && $_GET['sortby'] !='None')  {
        $query->query_vars['orderby'] = 'meta_value';
        $query->query_vars['meta_key'] = $_GET['sortby'];
    }
}

Et c'est tout ce que vous devez faire; pas « posts_order » ou « crochets de wp » nécessaires! Bien sûr, vous avez réellement besoin de faire plus; vous devez ajouter des colonnes sur votre page qui répertorie les messages de sorte que vous pouvez réellement voir les valeurs qu'il trie par ailleurs les utilisateurs se mucho confus. Alors ajoutez un crochet manage_{$post_type}_posts_columns, dans ce cas manage_movie_posts_columns. Ce crochet est transmis le tableau par défaut de colonnes et de simplicité je viens de le remplacer par deux colonnes standards; une case à cocher (cb) et un nom de poste (de title). (Vous pouvez inspecter posts_columns avec un print_r() pour voir ce qui est disponible par défaut.)

Je décidé d'ajouter un « Tri par: » quand il y a un paramètre d'URL de sortby et quand il ne None:

add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
    $posts_columns = array(
        'cb' => $posts_columns['cb'],
        'title' => 'Movie Name',
        );
    if (isset($_GET['sortby']) && $_GET['sortby'] !='None') 
        $posts_columns['meta_value'] = 'Sorted By';

    return $posts_columns;
}

Enfin, on utilise le crochet de manage_pages_custom_column pour afficher réellement la valeur quand il y a un poste du type de poste approprié et avec le test sans doute redondant pour is_admin() et $pagenow=='edit.php'. Quand il y a un paramètre d'URL de sortby on extrait la valeur du champ personnalisé qui est triée par un affichage dans notre liste. Voici à quoi il ressemble (rappelez-vous, ce sont des données de test donc pas de commentaires de la galerie d'arachide sur le classement des films:):


(source: mikeschinkel.com )

Et voici le code:

add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
    global $pagenow;
    $post = get_post($post_id);
    if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php')  {
        switch ($column_name) {
            case 'meta_value':
                if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
                    echo get_post_meta($post_id,$_GET['sortby'],true);
                }
                break;
        }
    }
}

Notez que ce ne capte que le premier « Genre » pour un movie, à savoir la première meta_value dans le cas de plusieurs valeurs pour une clé donnée. Mais là encore je ne sais pas comment cela fonctionnerait autrement!

Et pour ceux qui ne connaissent où mettre ce code, vous pouvez le mettre dans un plugin ou plus probablement pour les débutants dans le fichier functions.php dans votre thème actuel.

Comment cela aide.

Autres conseils

de WordPress 3.1 (j'utilise la version bêta) des colonnes peut désormais être triables par leurs titres.

Voici les détails de la façon dont les postes mettre en œuvre.

http://scribu.net/wordpress/custom-sortable-columns.html

Voici une solution simple:

/* --------Sortable Events on Dashboard - show start date, time, venue--------- */

/*-------------------------------------------------------------------------------
    Custom Columns
-------------------------------------------------------------------------------*/

function my_*YOUR POST TYPE*_columns($columns)
{
    $columns = array(
        'cb'        => '<input type="checkbox" />',
        'title'     => 'Title',
        'your_custom_field'     => 'Custom Field Name',          
        'date'      =>  'Date',
    );
    return $columns;
}

function my_custom_columns($column)
{
    global $post;
    if($column == 'your_custom_field')
    {
        if(get_post_meta($post->ID, 'your_custom_field', true);)
        {
            echo get_post_meta($post->ID, 'your_custom_field', true);
        }
    }

}

add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");

/*-------------------------------------------------------------------------------
    Sortable Columns
-------------------------------------------------------------------------------*/

function my_column_register_sortable( $columns )
{
    $columns['your_custom_field'] = 'your_custom_field';
    return $columns;
}

add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );

Il suffit de remplacer VOTRE TYPE POST et your_custom_field

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top