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.