web-dev-qa-db-fra.com

Diviser le contenu et la galerie

Existe-t-il un moyen de séparer 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?


Edit: / J'ai une semi-solution, mais cela semble être une longue route pour y parvenir. 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; ?>

Edit # 2 - Ok, je n'ai pu obtenir que les codes courts de la galerie par la poste. 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 puisqu'il le publie, 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 la boucle, il retournera mon code court deux fois (je suis sur une seule page, doit être bouclé deux fois - pour que son exécution ne soit pas do_shortcode ()). Pas certain de pourquoi.

22
Howdy_McGee

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

Commençons par commencer - récupérez 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:

24
Howdy_McGee

Shortcode de base Expressions régulières

Fondamentalement, 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 créer une expression régulière. La fonction principale get_shortcode_regex() n'offre malheureusement aucune chance d'introduire un argument, de sorte qu'il nous reste une expression rationnelle qui correspond à chaque shortcode, ce qui n'est pas souhaitable, car nous voulons uniquement 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'] )
) );

Catch 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 résultats pour le shortcode de la galerie sous forme de tableau avec un index 0 (le reste sera constitué de correspondances partielles et pourra être ignoré).

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

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

Le contenu sans galeries

La prochaine chose à faire est de supprimer tous les codes courts [gallery] du contenu. Nous allons utiliser le même Regex à nouveau et l'exécuter sur get_the_content(). Bien sûr, nous appliquons le filtre 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 $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 galeries, toutes deux séparées par une règle horizontale. Ce n'est qu'un point de départ.

4
kaiser

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 la publication propre 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 du poste. Si vous n'y placez pas de codes courts personnalisés, 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.

Suppose que tu sors

$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. Supprimer uniquement [gallery] code abrégé, conservez tous les autres codes abrégés.

S'appuie sur la réalisation interne de l'apparence du shortcode [gallery], qui peut être modifiée par l'équipe WP, donc peut-être pas aussi pérenne que la 1è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 ça

$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);
2
bob-12345