Separare Conținut și Galerie în WordPress
Există o metodă de a separa conținutul postării de shortcode-ul galeriei? Doresc să afișez galeria în afara conținutului normal, indiferent de modul sau locul în care este plasată. Pot folosi acest cod pentru a obține shortcode-ul:
if(has_shortcode(get_the_content(), 'gallery')){
$pattern = get_shortcode_regex();
preg_match("/$pattern/s", get_the_content(), $matches);
echo do_shortcode($matches[0]);
}
Dar acest lucru nu funcționează dacă shortcode-ul galeriei nu este prima instanță. Există o modalitate de a separa complet conținutul de galerie?
Editare: Am o soluție parțială, dar pare o metodă prea complicată. Mai întâi extrage primul shortcode din postare (ceea ce trebuie ajustat pentru a extrage doar shortcode-ul "Galerie"), apoi elimină toate shortcode-urile din conținut (din nou, nu exact ceea ce doresc).
<?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; ?>
Editare #2 - Am reușit să extrag doar shortcode-urile galeriei din postare. Am adăugat și un filtru pentru a elimina shortcode-ul galeriei din the_content()
- problema este că nu elimină complet shortcode-ul, deoarece acesta apare în continuare în conținut, dar nu-mi permite să rulez "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);
Bucla principală
<?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>
În bucla principală, shortcode-ul va apărea de două ori (sunt pe o pagină singulară, ar trebui să apară o singură dată - deci funcția do_shortcode() nu se execută corect). Nu sunt sigur de ce.

Deschis pentru oricine poate simplifica acest lucru, dar iată ce am creat și care a funcționat pentru mine.
Primul lucru - obține galeria, folosind get_post_gallery()
, imediat ce începe bucla:
<?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; ?>
Funcția 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;
}
Resurse:
Stackoverflow:
Ceea ce inițial am folosit, dar nu a funcționat cum mă așteptam:

singura problemă este că acest lucru elimină și toată formatarea conținutului, cum ar fi <p> și <br>.

Expresii regulate pentru shortcode-uri din nucleu
În principiu, putem face asta cu o expresie regulată - de fapt chiar cu expresia regulată furnizată de nucleu prin get_shortcode_regex()
.
Mai întâi trebuie să extragem tag-urile shortcode-urilor și să construim o expresie regulată. Funcția din nucleu get_shortcode_regex()
din păcate nu oferă posibilitatea de a introduce un argument, așa că am rămâne cu o expresie regulată care se potrivește cu fiecare shortcode, ceea ce nu este de dorit deoarece vrem să țintim doar shortcode-ul [gallery]
.
// Obținem toate tag-urile ca Array
$tags = $GLOBALS['shortcode_tags'];
// eliminăm shortcode-ul gallery; 'gallery' este cheia
unset( $tags['gallery'] );
// preluăm toate shortcode-urile (dar nu 'gallery') separate de un caracter pipe vertical/caracterul "sau" din Regex
$tags = join( '|', array_map(
'preg_quote',
array_keys( $GLOBALS['shortcode_tags'] )
) );
Prindem toate galeriile
Apoi avem nevoie de o expresie regulată care să prindă toate galeriile. Pentru asta vom apela preg_match_all()
deoarece va returna toate potrivirile pentru shortcode-ul gallery ca array cu un index 0
(restul vor fi potriviri parțiale și pot fi ignorate).
$pattern = get_shortcode_regex();
preg_match_all( "/$pattern/s", get_the_content(), $galleries );
Acum $galleries[0]
conține un array de tag-uri ale shortcode-urilor gallery.
Conținutul fără galerii
Următorul lucru pe care trebuie să-l facem este să eliminăm toate shortcode-urile [gallery]
din conținut. Vom folosi din nou aceeași expresie regulată și o vom rula pe get_the_content()
. Desigur, aplicăm filtrul the_content
deoarece shortcode-urile ar fi putut fi adăugate printr-un callback la momentul randării.
$content = preg_replace_callback(
"/$pattern/s",
'strip_shortcode_tag',
apply_filters( 'the_content', get_the_content() )
);
Variabila $content
acum conține conținutul nostru.
Exemplu de callback pentru modificarea conținutului
sau: Cum poți separa conținutul în galerii și restul postului
Am putea înlocui ușor conținutul cu noul nostru conținut în timpul unui 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() )
);
care ar adăuga mai întâi toate galeriile, apoi conținutul nostru fără galerii, ambele separate de o linie orizontală. Acesta este doar un punct de plecare.

folosind o abordare diferită ca în http://wordpress.stackexchange.com/questions/193511/formatting-post-content-to-exclude-gallery. când încerc codul tău primesc erori php - poți să arunci o privire, te rog?

Care cod? Ce erori? Detaliază, te rog. Asta e dezvoltare, nu jocuri de ghicit.

cod și detalii în link > http://wordpress.stackexchange.com/questions/193511/formatting-post-content-to-exclude-gallery

Nu ar trebui să fie atât de complicat. Codul de mai jos poate fi redus la câteva rânduri, dacă se dorește.
Abordarea 1. Obțineți conținutul curat al postării prin eliminarea tuturor shortcode-urilor, inclusiv a celui pentru galerie, din conținutul postării.
NB: toate celelalte shortcode-uri vor fi eliminate din postare. Dacă nu aveți shortcode-uri personalizate acolo, atunci această abordare este pentru dumneavoastră.
Presupunând că sunteți în bucla WP
$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // Acesta este conținutul dumneavoastră curățat
$glry = get_post_gallery(); // și aici este galeria.
Presupunând că sunteți în afara buclei
$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);
Abordarea 2. Eliminați doar shortcode-ul [gallery]
, păstrând toate celelalte shortcode-uri.
Se bazează pe implementarea internă a modului în care arată shortcode-ul [gallery]
, care poate fi modificat de echipa WP, deci poate nu este la fel de sigur pe viitor ca prima abordare:
În bucla WP
$ctt = preg_replace('/\[gallery.*\]/', '', get_the_content());
$ctt = apply_filters('the_content',$ctt); // Acesta este conținutul dumneavoastră curățat
$glry = get_post_gallery();
În afara buclei
$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);
