Inhalt und Galerie aufteilen

22

Gibt es eine Möglichkeit, den Inhalt des Posts und den Funktionscode der Galerie aufzuteilen? Ich möchte die Galerie außerhalb meines normalen Inhalts anzeigen, egal wie oder wo sie platziert ist. Ich kann dies verwenden, um den Shortcode selbst zu erhalten:

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

Dies funktioniert jedoch nicht, wenn der Funktionscode der Galerie nicht die erste Instanz ist. Gibt es eine Möglichkeit, meinen Inhalt und meine Galerie vollständig aufzuteilen?


Edit: Ich habe eine halbe Lösung, aber es scheint ein langwieriger Weg zu sein, um es zu tun. Zuerst wird der erste Shortcode in der Nachricht erfasst (der behoben werden muss, da ich nur den Shortcode "Galerie" möchte), dann werden alle Shortcodes aus dem Inhalt entfernt (wieder nicht wirklich das, was ich tun möchte).

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

Bearbeiten # 2 - Ok, ich konnte nur Galerie-Shortcodes in der Post erhalten. Ich habe auch einen Filter hinzugefügt, um das Galerie-Shortcode-Formular zu entfernen. Das the_content()Problem ist, dass der Shortcode nicht unbedingt entfernt wird, da er veröffentlicht wird, aber ich nicht "do_shortcode ()" ausführen kann.

Funktionen.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); 

Die Schleife

<?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 der Schleife gibt es zweimal meinen Kurzcode zurück (ich bin auf einer einzelnen Seite, sollte zweimal wiederholt werden - daher wird do_shortcode () nicht ausgeführt). Nicht sicher warum.

Howdy_McGee
quelle
1
Haben Sie darüber nachgedacht, eine separate WYSYWIG-Metabox nur für die Galerie hinzuzufügen? Das könnte man dann immer nachholen the_content(). Schwieriger, wenn es schon viele solche Seiten gibt.
GhostToast
Ich stimme zu, dass dies eine Möglichkeit ist, aber ich habe versucht, die Notwendigkeit eines anderen großen Herausgebers zu vermeiden - zu versuchen, es so einfach und direkt wie möglich zu gestalten. Ich wünschte, ich könnte (natürlich ohne Plugin) einfach eine Galerie-Metabox oder ähnliches hinzufügen.
Howdy_McGee
Warum verwenden Sie nicht die Lösung von Using preg_replace, um die Galerie vom Inhalt zu trennen?
fuxia

Antworten:

24

Offen für alle, die dies vereinfachen können, aber das, was ich mir ausgedacht habe, hat mir geholfen.

Das erste ist das erste - holen Sie sich die Galerie mit get_post_gallery(), sobald die Schleife beginnt:

<?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() Funktion - 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;
}

Ressourcen:

Paketüberfluss:

Was ich ursprünglich gemacht habe, was nicht wie erwartet funktioniert hat:

Howdy_McGee
quelle
4

Core Shortcode reguläre Ausdrücke

Grundsätzlich können wir das mit einem Regex machen - eigentlich sogar mit dem von core by bereitgestellten Regex get_shortcode_regex().

Zuerst müssen wir die Shortcode-Tags greifen und einen regulären Ausdruck erstellen. Die Kernfunktion get_shortcode_regex()bietet leider keine Möglichkeit, ein Argument einzubringen, sodass wir eine Regex haben, die jedem Shortcode entspricht, was unerwünscht ist, da wir nur auf den [gallery]Shortcode abzielen möchten .

// 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'] )
) );

Fange alle Galerien

Als nächstes brauchen wir einen Regex, der alle Galerien fängt. Daher rufen wir auf, preg_match_all()da es alle Übereinstimmungen für den Galerie-Shortcode als Array mit einem 0Index zurückgibt (der Rest wird teilweise übereinstimmen und kann ignoriert werden).

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

$galleries[0]Enthält jetzt eine Reihe von Galerie-Shortcode-Tags.

Der Inhalt ohne Galerien

Als nächstes müssen wir alle [gallery]Shortcodes aus dem Inhalt entfernen . Wir werden den gleichen Regex erneut verwenden und ihn ausführen get_the_content(). Natürlich wenden wir den the_contentFilter an, da der Shortcode beim Rendern durch einen Rückruf hinzugefügt werden könnte.

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

Die $contentVariable enthält jetzt unseren Inhalt.

Beispiel für einen Rückruf, um den Inhalt zu ändern

oder: Wie Sie den Inhalt in Galerien und den Rest des Beitrags aufteilen können

Wir könnten den Inhalt während eines Rückrufs einfach durch unseren neuen Inhalt ersetzen:

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

Das würde zuerst alle Galerien hinzufügen, dann unseren Inhalt ohne Galerien, beide durch eine horizontale Linie getrennt. Dies ist nur ein Ausgangspunkt.

Kaiser
quelle
Verwenden Sie einen anderen Ansatz als in wordpress.stackexchange.com/questions/193511/… . wenn ich Ihren Code versuche, erhalte ich PHP-Fehler - können Sie bitte einen Blick darauf werfen?
Adeerlike
Welcher Code? Welche Fehler? Detail bitte. Das ist Entwicklung, keine Ratespiele.
Kaiser
Code und Details in Link> wordpress.stackexchange.com/questions/193511/…
Adeerlike
2

Es sollte nicht sooo kompliziert sein. Der folgende Code kann auf Wunsch auf ein paar Zeilen gekürzt werden.

Vorgehensweise 1. Entfernen Sie alle Shortcodes, einschließlich der Galerie 1, aus dem Inhalt des Beitrags, um den Inhalt des sauberen Beitrags zu erhalten.

NB: Alle anderen Shortcodes werden von der Post entfernt. Wenn Sie dort keine benutzerdefinierten Shortcodes platzieren, ist der Ansatz der richtige für Sie.

Angenommen, Sie befinden sich in der WP-Schleife

$ctt = apply_filters('the_content',strip_shortcodes(get_the_content())); // This is your cleaned content
$glry = get_post_gallery(); // and here is the gallery.

Angenommen, Sie sind unterwegs

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

Ansatz 2. Nur entfernen [gallery] Shortcode , alle anderen Shortcodes beibehalten.

Verlässt sich auf die interne Erkenntnis, wie der [gallery]Shortcode aussieht, der vom WP-Team geändert werden kann, sodass er möglicherweise nicht so zukunftssicher ist wie der erste Ansatz:

In der WP-Schleife

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

Heraus

$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);
bob-12345
quelle