Dividi contenuti e galleria


22

C'è un modo per dividere il contenuto del post e il codice funzione della galleria. Voglio visualizzare la galleria al di fuori del mio normale contenuto, indipendentemente da come o dove sia collocata. Posso usarlo 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 il codice funzione della galleria non è la prima istanza. C'è un modo per dividere completamente i miei contenuti e la mia galleria?


Modifica: ho una semi-soluzione ma sembra un modo lungo e tortuoso per farlo. Prende innanzitutto il primo shortcode nel post (che deve essere risolto poiché voglio solo il shortcode "Gallery"), quindi rimuove tutti i codici brevi dal contenuto (di nuovo, non proprio 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 n. 2 - Ok, sono stato in grado di ottenere solo i codici brevi della galleria nel post. Ho anche aggiunto un filtro per rimuovere il modulo shortcode della galleria the_content()- il problema è che non rimuove necessariamente il shortcode dal momento che lo pubblica, 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 cappio

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

in The Loop restituirà il mio codice breve due volte (sono su una singola pagina, dovrebbe essere ripetuto due volte - quindi non esegue do_shortcode ()). Non so perché.


1
Hai preso in considerazione l'aggiunta di una meta box WYSYWIG separata solo per la galleria? Potresti quindi chiamare sempre per quello dopo the_content(). Più complicato se ci sono già molte pagine come questa, comunque.
GhostToast,

Sono d'accordo che sia una possibilità, ma stavo cercando di evitare la necessità di un altro grande editore, cercando di renderlo il più semplice e diretto possibile. Vorrei poter (senza un plugin ovviamente) avere solo un metabox da aggiungere alla galleria o qualcosa di simile.
Howdy_McGee

Risposte:


24

Aperto a chiunque possa semplificare questo, ma ecco cosa mi è venuto in mente che ha funzionato per me.

La prima cosa è la prima: prendi la galleria, usando get_post_gallery(), non appena inizia il ciclo:

<?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() Funzione - funzioni.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 che stavo originariamente spegnendo, che non ha funzionato come previsto:


4

Espressioni regolari core shortcode

Fondamentalmente possiamo farlo con un Regex - in realtà anche con il Regex fornito da core da get_shortcode_regex().

Per prima cosa dobbiamo prendere i tag shortcode e creare una regex. La funzione principale get_shortcode_regex()non offre purtroppo alcuna possibilità di lanciare un argomento, quindi ci rimarrebbe una regex che corrisponde a ogni singolo shortcode, che è indesiderato in quanto vogliamo solo targetizzare lo [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'] )
) );

Cattura tutte le gallerie

Successivamente abbiamo bisogno di un Regex che catturi tutte le gallerie. Pertanto stiamo chiamando preg_match_all()poiché restituirà tutte le partite per lo shortcode della galleria come array con un 0indice (il resto sarà una corrispondenza parziale e può essere ignorato).

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

Ora $galleries[0]contiene una serie di tag shortcode della galleria.

Il contenuto senza gallerie

La prossima cosa da fare è rimuovere tutti i [gallery]codici brevi dal contenuto. Useremo di nuovo lo stesso Regex e lo eseguiremo get_the_content(). Ovviamente applichiamo il the_contentfiltro poiché lo shortcode potrebbe essere stato aggiunto tramite un callback al momento del rendering.

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

La $contentvariabile ora contiene i nostri contenuti.

Esempio di callback per modificare il contenuto

oppure: come puoi suddividere il contenuto in gallerie e nel resto del post

Potremmo facilmente sostituire il contenuto con il nostro nuovo contenuto durante un 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, quindi aggiungere il nostro contenuto senza gallerie, entrambi separati da una regola orizzontale. Questo è solo un punto di partenza.


usando un approccio diverso come in wordpress.stackexchange.com/questions/193511/… . quando provo il tuo codice ottengo errori php - puoi per favore dare un'occhiata?
Adeerlike

Quale codice? Quali errori? Dettaglio, per favore. Questo è sviluppo, non indovinare i giochi.
Kaiser,


2

Non dovrebbe essere così complicato. Il codice seguente può essere abbreviato in un paio di righe a piacimento.

Approccio 1. Ottieni il contenuto del post pulito rimuovendo tutti i codici brevi, incluso quello della galleria dal contenuto del post.

NB: tutti gli altri codici brevi verranno rimossi dal post. Se non si inseriscono codici brevi personalizzati lì, l'approccio è per te.

Supponiamo di essere nel ciclo 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.

Supponiamo che tu sia fuori

$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 gli [gallery]shortcode, mantenere tutti gli altri shortcode.

Si basa sulla realizzazione interna [gallery]dell'aspetto del shortcode, che può essere modificato dal team di WP, quindi forse non è una prova futura come il primo approccio:

Nel ciclo WP

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

Fuori di esso

$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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.