it-swarm.com.de

Inhalt und Galerie aufteilen

Gibt es eine Möglichkeit, den Inhalt des Beitrags 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; ?>

Edit # 2 - Ok, ich konnte nur Galerie Shortcodes in der Post bekommen. Ich habe auch einen Filter zum Entfernen des Galerie-Shortcodes hinzugefügt the_content() - das Problem ist, dass der Shortcode nicht unbedingt entfernt wird, da er veröffentlicht wird, aber ich kann "do_shortcode ()" nicht ausführen.

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

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 wird mein kurzer Code zurückgegeben Zweimal (ich bin auf einer einzelnen Seite, sollte zweimal wiederholt werden - daher wird do_shortcode () nicht ausgeführt). Nicht sicher warum.

22
Howdy_McGee

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

Das erste ist, dass Sie die Galerie mit get_post_gallery() abrufen, sobald die Schleife startet:

<?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() Function - 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:

24
Howdy_McGee

Core Shortcode reguläre Ausdrücke

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

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, so dass wir mit einer Regex zurückbleiben, die jedem Shortcode entspricht. Dies ist unerwünscht, da wir nur den [gallery]-Shortcode als Ziel festlegen 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. Aus diesem Grund rufen wir preg_match_all() auf, da alle Übereinstimmungen für den Galerie-Shortcode als Array mit einem 0-Index zurückgegeben werden (der Rest entspricht nur teilweise und kann ignoriert werden).

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

Jetzt enthält $galleries[0] 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 denselben Regex erneut verwenden und ihn auf get_the_content() ausführen. Natürlich wenden wir den the_content-Filter an, da der Shortcode beim Rendern durch einen Rückruf hätte hinzugefügt werden können.

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

Die Variable $content 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.

4
kaiser

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

Ansatz 1. Holen Sie sich den sauberen Post-Inhalt, indem Sie alle Shortcodes, einschließlich der Galerie eine aus dem Post-Inhalt entfernen.

NB: Alle anderen Shortcodes werden von der Post entfernt. Wenn Sie dort keine benutzerdefinierten Shortcodes platzieren, ist der Ansatz 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. Entfernen Sie nur [gallery] shortcode, behalten Sie alle anderen shortcodes in.

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