web-dev-qa-db-fra.com

Comment puis-je obtenir les attributs d'un code court d'une publication?

J'essaie de prévisualiser une galerie NextGen sur ma page principale (et les pages de catégories) pour afficher une seule image de la galerie sur la page principale à côté du texte de l'article qui apparaît normalement. J'ai trouvé des exemples de PHP qui récupèrent les images d'une galerie à partir d'un identifiant de galerie. Dans ma boucle, j'ai un post en cours. Ce que je ne peux pas comprendre, c'est comment, à partir d'un post, obtenir les attributs du code court [nggallery].

En d’autres termes, pour chaque publication avec une galerie NextGEN, j’ai besoin de la valeur id du code abrégé. Par exemple, si l'article contient [nggallery id=50], j'ai besoin de la valeur 50.

Comment puis-je obtenir cette information d'un post?

J'espérais trouver la solution dans le code source du plug-in de prochaine génération, mais ce code enregistrait bien sûr un gestionnaire de code abrégé et permettions à WP de les rappeler. Il n'y a pas d'exemples dans leur code source où ils analysent une publication à la recherche de leur code court.

2
Ian Lelsie

J'ai trouvé une solution. Après de nombreuses recherches autour de I j'ai trouvé du code qui détermine si un message contient un code abrégé spécifique.

Ce code tente également d'analyser les paramètres du code abrégé. Ce qui est bien parce que je veux l'identifiant de la galerie. Il y avait quelques problèmes avec le code tel que posté, alors je l'ai modifié. Voici un code qui peut trouver un code court dans une publication et obtenir ses paramètres:

        <?php //  Look for a NextGEN gallery
        $galleryID;
        $previewIndex = 1; 
        $regex_pattern = get_shortcode_regex();
        preg_match ('/'.$regex_pattern.'/s', $post->post_content, $regex_matches);
        if ($regex_matches[2] == 'nggallery') :
            //  Found a NextGEN gallery find out what ID
            //  Turn the attributes into a URL parm string
            $attribureStr = str_replace (" ", "&", trim ($regex_matches[3]));
            $attribureStr = str_replace ('"', '', $attribureStr);

            //  Parse the attributes
            $defaults = array (
                'preview' => '1',
            );
            $attributes = wp_parse_args ($attribureStr, $defaults);

            if (isset ($attributes["id"])) :
                $galleryID = $attributes["id"];
            endif;
            if (isset($attributes["preview"])) :
                $previewIndex = $attributes["preview"];
            endif;
        endif;
        ?>

Ce qui devait être peaufiné était le traitement des paramètres. Utilisez trim au lieu d’une charte secrète et passez à wp_parse_args pour gérer correctement les paramètres de code court. Une fois que le code ci-dessus a fini de s'exécuter dans une boucle WP, le $galleryID contiendra l'ID de la galerie NextGEN et previewIndex sera défini sur l'index de prévisualisation ou sur 1 si aucun attribut previewIndex n'était présent.

previewIndex est un attribut que j'ai "ajouté" pour indiquer quelle vignette utiliser pour l'aperçu de la galerie. NextGEN l'ignore et les galeries s'affichent normalement, mais je peux maintenant l'utiliser pour mon thème pour afficher une icône spécifique dans l'entrée de prévisualisation.

Voici le code de mon loop-index.php et loop-category.php qui gère la création de l'aperçu de la galerie:

            <?php /* Enhance the content preview with an image from the NextGEN gallery */ ?>
            <?php
            global $nggdb;
            $gallery = $nggdb->get_gallery ($galleryID, 'sortorder', 'ASC', true, 0, 0);
            $image = $gallery[$previewIndex];
            $total_images = count ($gallery);
            ?>

            <?php if (isset($image)  &&  isset($image->thumbURL)) : ?>
                <?php /* Show the thumbnail */ ?>
                <a href="<?php the_permalink(); ?>" title="<?php printf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ); ?>" rel="bookmark">
                    <img class="entry-preview-image" src="<?php echo $image->thumbURL ?>" align="left" />
                </a>
            <?php endif; ?>

            <?php /* Show the text excerpt */ ?>
            <?php the_excerpt(); ?>

            <?php /* Show the statement of number of images contained */ ?>
            <em><?php printf( _n( 'This gallery contains <a %1$s>%2$s photo</a>.', 'This gallery contains <a %1$s>%2$s photos</a>.', $total_images, 'twentyten' ),
                'href="' . get_permalink() . '" title="' . sprintf( esc_attr__( 'Permalink to %s', 'twentyten' ), the_title_attribute( 'echo=0' ) ) . '" rel="bookmark"',
                number_format_i18n( $total_images )); ?>
            </em>
        <?php endif; ?>

Ceci utilise les informations d’une autre réponse concernant l’accès à NextGEN gallery objects afin d’obtenir la vignette et le nombre d’images dans la galerie.

1
Ian Lelsie

Votre solution m'a aidé à trouver une solution à mon problème d'obtention de l'attribut d'un certain code abrégé, mais je crains que votre approche ne pose un problème.

Vous utilisez preg_match pour vérifier le post_content, qui ne renverra qu'une correspondance. Si vous avez une publication qui contient plusieurs codes abrégés, elle ne renverra que la première, qui n'est peut-être pas celle que vous recherchez.

Au lieu de cela, vous devez utiliser preg_match_all, puis parcourir le tableau regex_matches pour rechercher le code court dont vous avez besoin.

De plus, vous n'avez pas besoin d'utiliser str_replace pour supprimer les guillemets de la chaîne. Wordpress a une fonction intégrée shortcode_parse_atts qui prend une chaîne de paramètres (dans votre cas, ce serait $regex_matches[3]) en tant qu'argument et génère un tableau. Cela vous éviterait également l'utilisation de la fonction wp_parse_args.

2
Andrei G.