Separare Conținut și Galerie în WordPress

6 nov. 2013, 22:52:55
Vizualizări: 14.6K
Voturi: 23

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.

3
Comentarii

Ai luat în considerare adăugarea unui meta box WYSIWYG separat doar pentru galerie? Apoi ai putea să-l apelezi mereu după the_content(). Mai complicat dacă există deja multe pagini de acest fel, totuși.

GhostToast GhostToast
6 nov. 2013 23:29:14

Sunt de acord că este o posibilitate, dar încercam să evit nevoia unui alt editor complex - încercând să fac totul cât mai simplu și direct. Mi-aș dori să pot (fără un plugin, desigur) să am doar un meta box pentru adăugarea galeriei sau ceva similar.

Howdy_McGee Howdy_McGee
6 nov. 2013 23:41:23

De ce nu folosești soluția din Folosirea preg_replace pentru a separa galeria de the_content?

fuxia fuxia
6 apr. 2014 20:12:56
Toate răspunsurile la întrebare 3
2
24

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:

7 nov. 2013 01:03:33
Comentarii

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

Al Rosado Al Rosado
5 ian. 2020 22:53:58

@AlRosado Nu credeam că această soluție face asta, dar dacă e așa, poți încerca să rulezi conținutul prin echo apply_filters( 'the_content', $content );

Howdy_McGee Howdy_McGee
6 ian. 2020 07:27:31
3

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.

6 apr. 2014 19:44:46
Comentarii

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?

Adeerlike Adeerlike
4 iul. 2015 19:02:35

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

kaiser kaiser
5 iul. 2015 13:22:25
0

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);
12 oct. 2017 12:04:00