web-dev-qa-db-fra.com

Wordpress 3.5 Menu Galerie Ordre non défini?

Avec le nouvel éditeur de galerie dans Wordpress, je peux configurer mes galeries et faire glisser les vignettes pour réorganiser l'ordre des images. Sur le backend, cela semble bien fonctionner. Mais j’ai rencontré un problème lorsque j’essayais d’afficher la galerie au début en utilisant l’attribut 'orderby' => 'menu_order'. L'affichage n'utilisait pas menu_order. Lorsque j'ai consulté la base de données, j'ai constaté que la valeur menu_order de mes pièces jointes était toujours égale à 0 pour toutes les images de la galerie. Il semble donc que réorganiser et enregistrer des galeries dans Wordpress 3.5 ne définit pas la valeur menu_order dans la base de données. Est-ce un bug? Quelqu'un d'autre a-t-il rencontré cela? Si oui connaissez-vous une solution?

2
Adam Christianson

Vous avez raison.

Le menu_order n'est plus utilisé pour les médias dans la galerie. Malheureusement, il semble que la seule "source" de l'ordre de la galerie soit l'argument "ids" du shortcode de la galerie qui est incorporé dans le contenu de la page/publication.

Vous ne savez pas trop si c'est par conception ou par inadvertance, mais cela pourrait être par conception, car vous pouvez désormais inclure un média dans une galerie même s'il n'est pas "attaché" à la page/à la publication. Dans tous les cas, voici la méthode que j'utilise pour récupérer les identifiants et obtenir les pièces jointes en fonction de l'ordre spécifié dans le shortcode.

La clé réside dans le fait que le paramètre "orderby" de l'appel à get_posts doit être "post__in". Il lui est donc demandé de procéder à l'aide de la commande post id spécifiée dans le paramètre "include". Voir ci-dessous.

// helper function to return first regex match
function get_match( $regex, $content ) {
    preg_match($regex, $content, $matches);
    return $matches[1];
} 

// Extract the shortcode arguments from the $page or $post
$shortcode_args = shortcode_parse_atts(get_match('/\[gallery\s(.*)\]/isU', $post->post_content));

// get the ids specified in the shortcode call
$ids = $shortcode_args["ids"];

// get the attachments specified in the "ids" shortcode argument
$attachments = get_posts(
    array(
        'include' => $ids, 
        'post_status' => 'inherit', 
        'post_type' => 'attachment', 
        'post_mime_type' => 'image', 
        'order' => 'menu_order ID', 
        'orderby' => 'post__in', //required to order results based on order specified the "include" param
    )
);

Ce n'est pas idéal et ce serait bien si WP core stockait cette commande quelque part dans la base de données, mais cela fonctionnera jusqu'à ce que nous ayons une méthode plus propre.

J'espère que cela pourra aider!

2
anderly

il me semble qu'après avoir parcouru les codes sources (PHP et JS), cette galerie et son ordre ne sont pas du tout sauvegardés dans la base de données. Gallery n’existe que dans JS lorsque vous créez cela et ne persiste même pas lorsque vous quittez une page de post-édition.

La galerie n’est sauvegardée que par l’insertion d’un shortcode de galerie avec l’ordre exact des identifiants déclarés dans ce shortcode - aucune information supplémentaire n’est sauvegardée dans la base de données, il s’agit uniquement de ce shortcode.

Si vous voulez boucler les pièces jointes d'une publication par ordre de menu, vous devez attribuer à la pièce jointe post_type un nouveau support pour les attributs de page du plugin ou votre functions.php en insérant ce code:

add_action('init', 'my_custom_init');

function my_custom_init() {
    add_post_type_support( 'attachment', 'page-attributes' );
}

Mais, franchement, assigner un ordre de menu en entrant chaque page d'édition en pièce jointe est assez pénible. Si vous avez besoin de lister les pièces jointes par ordre de menu, la galerie par défaut de WP 3.5 n'est pas faite pour vous et je vous suggère d'utiliser un plugin éprouvé (par exemple, NextGen Gallery) ou d'écrire un plugin personnalisé qui vous permettra. soit pour définir l’ordre des menus dans Media Uploader ou Library.

2
david.binda

Juste un suivi, car cela m'est revenu sur un autre projet récent. J'ai utilisé la solution publiée ici par l'utilisateur (vickybiswas):

http://wordpress.org/support/topic/35-rc1-menu_order-not-saved-to-the-database-for-attached-images

Ce qui est bien avec cela, c'est que cela ajoutera l'ordre du menu aux éléments de la base de données. Semble travailler pour moi sans aucun problème jusqu'à présent.

Voici le code qu'il a fourni:

function pmc_gallery_menu_order_fix($id) {
        $regex_pattern = get_shortcode_regex();
        preg_match ('/'.$regex_pattern.'/s', stripslashes($_POST['content']), $regex_matches);
        if ($regex_matches[2] == 'gallery') :
            $attribureStr = str_replace (" ", "&", trim ($regex_matches[3]));
            $attribureStr = str_replace ('"', '', $attribureStr);
            $attributes = wp_parse_args ($attribureStr);
        endif;
        $ids = explode(',', $attributes[ids]);
        $images = get_posts( array(
        'post_parent' => $post->ID,
        'numberposts' => '-1',
        'post_status' => 'inherit',
        'post_type' => 'attachment',
        'post_mime_type' => 'image',
        'orderby' => 'menu_order ID',
        'order' => 'ASC'
    ) );
    if ( empty($images) ) {
        // no attachments here
    } else {
        foreach ( $images as $attachment_id => $attachment ) {
            if (in_array($attachment->ID, $ids)) {
                $update_post = array();
                $update_post['ID'] = $attachment->ID;
                $update_post['menu_order'] = array_search($attachment->ID, $ids);
                wp_update_post( $update_post );
            };
        }
    }
}
add_action('pre_post_update', 'pmc_gallery_menu_order_fix');
1
Adam Christianson

J'ai eu un problème similaire, il semble que l'ordre du menu ne soit pas défini jusqu'à ce que vous apportiez une modification en faisant glisser une image vers un nouvel emplacement, puis il est enregistré de manière asynchrone pour toutes les images de l'ensemble.

L'ordre du menu semble également se limiter aux images attachées à un message particulier, même si, honnêtement, je n'ai pas autant joué avec les autres.

J'espère que ça aide.

0
Zach Anderson