Separare Contenuto e Galleria

6 nov 2013, 22:52:55
Visualizzazioni: 14.6K
Voti: 23

Esiste un modo per separare il contenuto del post e il shortcode della galleria? Vorrei visualizzare la galleria al di fuori del mio contenuto normale, indipendentemente da come o dove è posizionata. Posso usare questo codice per ottenere lo shortcode stesso:

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

Ma questo non funziona se lo shortcode della galleria non è la prima istanza. Esiste un modo per separare completamente il mio contenuto e la galleria?


Modifica: Ho una soluzione parziale ma sembra un metodo macchinoso. Prima estrae il primo shortcode nel post (che deve essere corretto poiché voglio solo lo shortcode "Gallery") poi rimuove tutti gli shortcode dal contenuto (di nuovo, non esattamente quello che voglio fare).

<?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; ?>

Modifica #2 - Ok, sono riuscito a ottenere solo gli shortcode della galleria nel post. Ho anche aggiunto un filtro per rimuovere lo shortcode della galleria da the_content() - il problema è che non lo rimuove completamente poiché lo mostra ancora, ma non mi permette di eseguire "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); 

Il Loop

<?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>

nel Loop restituisce il mio shortcode Due volte (sono su una pagina singola, dovrebbe essere loopato due volte - quindi non sta eseguendo do_shortcode()). Non sono sicuro del perché.

3
Commenti

Hai considerato l'aggiunta di un meta box WYSIWYG separato solo per la galleria? Potresti quindi richiamarlo sempre dopo the_content(). Più complicato se ci sono già molte pagine così, però.

GhostToast GhostToast
6 nov 2013 23:29:14

Concordo che sia una possibilità, ma cercavo di evitare la necessità di un altro editor complesso - cercando di renderlo il più semplice e diretto possibile. Vorrei poter (senza un plugin ovviamente) avere semplicemente un meta box per aggiungere la galleria o qualcosa di simile.

Howdy_McGee Howdy_McGee
6 nov 2013 23:41:23

Perché non usi la soluzione da Usare preg_replace per separare la galleria da the_content?

fuxia fuxia
6 apr 2014 20:12:56
Tutte le risposte alla domanda 3
2
24

Aperto a chiunque possa semplificare questo procedimento, ma ecco cosa ho creato e che ha funzionato per me.

Prima cosa da fare - ottenere la galleria, utilizzando get_post_gallery(), non appena inizia il loop:

<?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; ?>

Funzione strip_shortcode_gallery() - 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;
}

Risorse:

Stackoverflow:

Quello su cui mi basavo originariamente, ma che non ha funzionato come previsto:

7 nov 2013 01:03:33
Commenti

l'unico problema è che questo rimuove anche tutta la formattazione del contenuto, come <p> e <br>.

Al Rosado Al Rosado
5 gen 2020 22:53:58

@AlRosado non pensavo che questo lo facesse, ma se è così potresti provare a passarlo attraverso echo apply_filters( 'the_content', $content );

Howdy_McGee Howdy_McGee
6 gen 2020 07:27:31
3

Espressioni regolari per gli shortcode di base

Fondamentalmente possiamo farlo con una Regex - in realtà anche con quella fornita dal core tramite get_shortcode_regex().

Per prima cosa dobbiamo ottenere i tag degli shortcode e costruire una regex. La funzione core get_shortcode_regex() purtroppo non permette di passare un argomento, quindi ci troveremmo con una regex che corrisponde a ogni singolo shortcode, il che non è desiderato visto che vogliamo solo prendere di mira lo shortcode [gallery].

// Ottieni tutti i tag come Array
$tags = $GLOBALS['shortcode_tags'];
// rimuovi lo shortcode gallery; 'gallery' è la chiave
unset( $tags['gallery'] );
// recupera tutti gli shortcode (tranne 'gallery') separati da un carattere pipe verticale/il carattere "o" della Regex
$tags = join( '|', array_map(
    'preg_quote',
    array_keys( $GLOBALS['shortcode_tags'] )
) );

Cattura tutte le gallerie

Poi abbiamo bisogno di una Regex che catturi tutte le gallerie. Per questo chiamiamo preg_match_all() poiché restituirà tutte le corrispondenze per lo shortcode gallery come array con un indice 0 (il resto saranno corrispondenze parziali e può essere ignorato).

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

Ora $galleries[0] contiene un array di tag di shortcode gallery.

Il contenuto senza gallerie

La prossima cosa da fare è rimuovere tutti gli shortcode [gallery] dal contenuto. Useremo la stessa Regex di nuovo e la eseguiremo su get_the_content(). Ovviamente applichiamo il filtro the_content poiché gli shortcode potrebbero essere stati aggiunti da una callback al momento del rendering.

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

La variabile $content ora contiene il nostro contenuto.

Esempio di callback per modificare il contenuto

ovvero: Come puoi dividere il contenuto in gallerie e il resto del post

Potremmo semplicemente sostituire il contenuto con il nostro nuovo contenuto durante una callback:

$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() )
);

che prima aggiungerebbe tutte le gallerie, poi il nostro contenuto senza gallerie, entrambi separati da una linea orizzontale. Questo è solo un punto di partenza.

6 apr 2014 19:44:46
Commenti

utilizzando un approccio diverso come in http://wordpress.stackexchange.com/questions/193511/formatting-post-content-to-exclude-gallery. quando provo il tuo codice ottengo errori php - puoi dare un'occhiata?

Adeerlike Adeerlike
4 lug 2015 19:02:35

Quale codice? Quali errori? Dettagli, per favore. Questo è sviluppo, non giochi di indovinelli.

kaiser kaiser
5 lug 2015 13:22:25
0

Non dovrebbe essere così complicato. Il codice qui sotto può essere ridotto a poche righe se lo si desidera.

Approccio 1. Ottenere il contenuto pulito del post rimuovendo tutti gli shortcode, incluso quello della galleria dal contenuto del post.

NB: tutti gli altri shortcode verranno rimossi dal post. Se non inserisci shortcode personalizzati, allora questo approccio fa per te.

Supponiamo che tu sia nel loop di WordPress

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // Questo è il tuo contenuto pulito
$glry = get_post_gallery(); // e qui c'è la galleria.

Supponiamo che tu sia fuori dal loop

$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);

Approccio 2. Rimuovere solo lo shortcode [gallery], mantenendo tutti gli altri shortcode.

Si basa sull'implementazione interna di come lo shortcode [gallery] viene visualizzato, che potrebbe essere modificato dal team di WordPress, quindi forse non è solido come il primo approccio:

Nel loop di WordPress

$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // Questo è il tuo contenuto pulito
$glry = get_post_gallery();

Fuori dal loop

$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);
12 ott 2017 12:04:00