Diviser le contenu et la galerie

22

Existe-t-il un moyen de diviser 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 ou 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. Existe-t-il un moyen de diviser complètement mon contenu et ma galerie?


Edit: J'ai une semi-solution mais cela semble être un long chemin à parcourir. Il saisit d'abord le premier shortcode dans le post (qui doit être corrigé car je ne veux que le shortcode "Gallery") puis supprime tous les shortcodes du contenu (encore une fois, 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 shortcodes de la galerie dans le post. J'ai également ajouté un filtre pour supprimer le formulaire de shortcode de la galerie the_content()- le problème est qu'il ne supprime pas nécessairement le shortcode car 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 The Loop, il renverra mon code court deux fois (je suis sur une seule page, devrait être bouclé deux fois - donc il ne fonctionne pas do_shortcode ()). Pas certain de pourquoi.

Howdy_McGee
la source
1
Avez-vous envisagé d'ajouter une méta-boîte WYSYWIG distincte uniquement pour la galerie? Vous pourriez alors toujours demander cela après the_content(). Cependant, c'est plus difficile s'il y a déjà beaucoup de pages comme celle-ci.
GhostToast
Je conviens que c'est une possibilité, mais j'essayais d'éviter le besoin d'un autre grand éditeur - en essayant de le rendre aussi simple et direct que possible. J'aimerais pouvoir (sans plugin bien sûr) simplement avoir une métabox d'ajout de galerie ou quelque chose de similaire.
Howdy_McGee
Pourquoi n'utilisez-vous pas la solution de l' utilisation de preg_replace pour séparer la galerie de the_content?
fuxia

Réponses:

24

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

La première chose est la première - obtenir la galerie, en utilisant get_post_gallery(), dès que la boucle commence:

<?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() Fonction - 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 que je quittais à l'origine, qui n'a pas fonctionné comme prévu:

Howdy_McGee
la source
4

Expressions régulières de shortcode de base

Fondamentalement, nous pouvons le faire avec une Regex - en fait même avec la Regex fournie par core par get_shortcode_regex().

Nous devons d'abord saisir les balises shortcode et construire une expression régulière. La fonction principale get_shortcode_regex()n'offre malheureusement aucune chance de lancer un argument, nous nous retrouverions donc avec une expression régulière qui correspond à chaque shortcode, ce qui n'est pas souhaité car nous voulons uniquement cibler le [gallery]shortcode.

// 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'une Regex qui attrape 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 0index (le reste sera des correspondances partielles et peut être ignoré).

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

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

Le contenu sans galeries

La prochaine chose que nous devons faire est de supprimer tous les [gallery]shortcodes du contenu. Nous utiliserons à nouveau le même Regex et l'exécuterons get_the_content(). Bien sûr, nous appliquons le the_contentfiltre car un 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 $contentvariable contient maintenant notre contenu.

Exemple de rappel pour modifier le contenu

ou: Comment diviser le contenu en galeries et le reste du message

Nous pourrions facilement 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() )
);

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

kaiser
la source
en utilisant une approche différente de celle de wordpress.stackexchange.com/questions/193511/… . lorsque j'essaie votre code, j'obtiens des erreurs php - pouvez-vous s'il vous plaît jeter un oeil?
Adeerlike
Quel code? Quelles erreurs? Détails, s'il vous plaît. C'est du développement, pas des jeux de devinettes.
kaiser
code et détails dans le lien> wordpress.stackexchange.com/questions/193511/…
Adeerlike
2

Cela ne devrait pas être trop compliqué. Le code ci-dessous peut être raccourci à quelques lignes à souhait.

Approche 1. Obtenez le contenu propre de la publication en supprimant tous les shortcodes, y compris celui de la galerie du contenu de la publication.

NB: tous les autres shortcodes seront supprimés de la publication. Si vous n'y placez pas de shortcodes personnalisés, alors l'approche est 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.

Supposez 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 les [gallery]shortcodes, conservez tous les autres shortcodes.

S'appuie sur la réalisation interne de l' [gallery]apparence du shortcode, qui peut être modifiée par l'équipe WP, donc peut-être pas aussi à l'épreuve du temps 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);
bob-12345
la source