Diviser le contenu et la galerie

21

Existe-t-il un moyen de scinder le contenu du message et le code court de la galerie? Je souhaite afficher la galerie en dehors de mon contenu normal, peu importe comment et où elle est placée. Je peux l'utiliser pour obtenir le shortcode lui-même:

if(has_shortcode(get_the_content(), 'gallery')){
    $pattern = get_shortcode_regex(); 
    preg_match("/$pattern/s", get_the_content(), $matches);
    echo do_shortcode($matches[0]);
}

Mais cela ne fonctionne pas si le code court de la galerie n’est pas la première instance. Est-il possible de scinder complètement mon contenu et ma galerie?

Modifier: J'ai une solution semi-sensée, mais cela semble être une longue route pour y remédier. Il saisit d’abord le premier shortcode de la publication (qui doit être corrigé car je ne souhaite que le shortcode "Galerie") puis supprime tous les shortcodes du contenu (encore une fois, ce n’est pas vraiment ce que je veux faire.

<?php if(has_shortcode(get_the_content(), 'gallery')) : ?>
    <?php 
        $pattern = get_shortcode_regex(); 
        preg_match("/$pattern/s", get_the_content(), $matches);
    ?>
    <div id="content">
        <?php echo strip_shortcodes(get_the_content()); ?>
    </div>
    <div id="gallery">
        <?php echo do_shortcode($matches[0]); ?>
    </div>
<?php endif; ?>

Modifier n ° 2 : je n'ai pu obtenir que les codes courts de la galerie dans le message. J'ai également ajouté un filtre pour supprimer le shortcode de la galerie, the_content() . Le problème est qu'il ne supprime pas nécessairement le shortcode car il le poste, mais ne me permet pas d'exécuter "do_shortcode ()"

Functions.php

function remove_gallery($content) {
    global $post;

    if($post->post_type == 'artcpt')
        remove_shortcode('gallery', $content);

    return $content;
}
add_filter( 'the_content', 'remove_gallery', 6); 

La boucle

<?php preg_match('/\[gallery ids=[^\]]+\]/', get_the_content(), $matches); ?>
<div id="content">
    <?php the_content(); ?>
</div>
<div id="gallery">
    <?php echo do_shortcode($matches[0]); ?>
</div>

dans The Loop, il retournera mon code court Deux fois (je suis sur une seule page, je devrais être mis en boucle deux fois - pour que son exécution n’exécute pas do_shortcode ()). Je ne sais pas pourquoi.

    
posée Howdy_McGee 06.11.2013 - 21:52
la source

3 réponses

22

Ouvert à tous ceux qui peuvent simplifier cela, mais voici ce que j’ai trouvé qui a fonctionné pour moi.

Commençons par obtenir la galerie en utilisant get_post_gallery() , dès le début de la boucle:

<?php if( have_posts() ) : ?>

    <?php while( have_posts() ) :
            the_post();
            $gallery = get_post_gallery();
            $content = strip_shortcode_gallery( get_the_content() );
    ?>

        <div id="content">
            <?php echo $content; ?>
        </div> <!-- id="content" -->

        <div id="gallery">
            <?php echo $gallery; ?>
        </div> <!-- id="gallery" -->

    <?php endwhile; ?>

<?php endif; ?>

strip_shortcode_gallery() Function - functions.php

function strip_shortcode_gallery( $content ) {
    preg_match_all( '/' . get_shortcode_regex() . '/s', $content, $matches, PREG_SET_ORDER );

    if ( ! empty( $matches ) ) {
        foreach ( $matches as $shortcode ) {
            if ( 'gallery' === $shortcode[2] ) {
                $pos = strpos( $content, $shortcode[0] );
                if( false !== $pos ) {
                    return substr_replace( $content, '', $pos, strlen( $shortcode[0] ) );
                }
            }
        }
    }

    return $content;
}

Ressources:

Stackoverflow:

Ce qui me dérangeait à l'origine et qui n'a pas fonctionné comme prévu:

réponse donnée Howdy_McGee 07.11.2013 - 00:03
la source
4

Expressions régulières de code court de base

En gros, nous pouvons le faire avec un regex - même avec le regex fourni par core par get_shortcode_regex() .

Nous devons d’abord saisir les balises shortcode et construire une regex. La fonction principale get_shortcode_regex() n'offre malheureusement aucune chance d'introduire un argument. Nous aurions donc une regex qui correspond à chaque shortcode, ce qui n'est pas souhaitable, car nous voulons seulement cibler le shortcode [gallery] .

// Get all tags as Array
$tags = $GLOBALS['shortcode_tags'];
// remove the gallery-shortcode; 'gallery' is the key
unset( $tags['gallery'] );
// retrieve all shortcodes (but not 'gallery') separated by a vertical pipe char/the "or" Regex char
$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );

Voir toutes les galeries

Ensuite, nous avons besoin d’un regex qui capture toutes les galeries. Par conséquent, nous appelons preg_match_all() car il renverra tous les correspondances pour le shortcode de la galerie sous forme de tableau avec un 0 index (le reste sera des correspondances partielles et pourra être ignoré).

$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );

Maintenant, $galleries[0] contient un tableau de balises shortcode de la galerie.

Le contenu sans galeries

La prochaine chose à faire est de supprimer tous les% codes courts du contenu. Nous allons utiliser le même Regex à nouveau et l'exécuter sur [gallery] . Bien sûr, nous appliquons le filtre get_the_content() car le shortcode aurait pu être ajouté via un rappel au moment du rendu.

$content = preg_replace_callback(
    "/$pattern/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

La variable the_content contient maintenant notre contenu.

Exemple de rappel pour modifier le contenu

ou: comment diviser le contenu en galeries et dans le reste du message

Nous pourrions facilement simplement remplacer le contenu par notre nouveau contenu lors d'un rappel:

$tags = $GLOBALS['shortcode_tags'];
unset( $tags['gallery'] );

$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );
$pattern = get_shortcode_regex();

preg_match_all( "/{$pattern}/s", get_the_content(), $galleries );

echo $galleries;
echo "<hr>";
echo preg_replace_callback(
    "/{$pattern}/s",
    'strip_shortcode_tag',
    apply_filters( 'the_content', get_the_content() )
);

qui ajouterait d’abord toutes les galeries, puis notre contenu sans les galeries, toutes deux séparées par une règle horizontale. Ceci n'est qu'un point de départ.

    
réponse donnée kaiser 06.04.2014 - 18:44
la source
0

Cela ne devrait pas être trop compliqué. Le code ci-dessous peut être réduit à deux lignes à la demande.

Approche 1. Obtenez le contenu de publication pur en supprimant tous les codes courts, y compris celui de la galerie, du contenu de la publication.

NB: tous les autres codes courts seront supprimés de la publication. Si vous ne placez pas de codes abrégés à cet endroit, l’approche est faite pour vous.

Supposons que vous êtes dans la boucle WP

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.

Supposons que vous soyez absent

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',strip_shortcodes($my_post->post_content));
$glry = get_post_gallery($my_postid);

Approche 2. Supprimez uniquement [gallery] shortcode, conservez tous les autres shortcodes.

Se fie à la réalisation interne de l’apparence du shortcode [gallery] , qui peut être modifiée par l’équipe de WP, donc peut-être pas aussi durable que la première approche:

Dans la boucle WP

$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // This is your cleaned content
$glry = get_post_gallery();

En dehors de cela

$my_postid = 12;
$my_post = get_post($my_postid);
$ctt = apply_filters('the_content',preg_replace('/\[gallery.*\]/', '', $my_post->post_content));
$glry = get_post_gallery($my_postid);
    
réponse donnée bob-12345 12.10.2017 - 11:04
la source

Lire d'autres questions sur les étiquettes