Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Wordpress remove shortcode and save for use elsewhere

Trying to remove the gallery shortcode from the post content and save in a variable for use elsewhere in the template. The new Wordpress gallery tool is great for selecting which images they want and assigning captions, hoping to use this to create the gallery, but then pull it out of the content on the front-end.

So this little snipped works just fine for removing the gallery and reapplying formatting... however I want to save that gallery shortcode.

$content = strip_shortcodes( get_the_content() );
$content = apply_filters('the_content', $content);
echo $content;

Hoping to save the shortcode so it can be parsed into an array and used to recreate a custom gallery setup on the front-end. An example of this shortcode I'm trying to save is...

[gallery ids="1079,1073,1074,1075,1078"]

Any suggestions would be greatly appreciated.

like image 321
Simon Avatar asked Feb 16 '23 04:02

Simon


2 Answers

Function to grab First Gallery shortcode from post content:

// Return first gallery shortcode
function get_shortcode_gallery ( $post = 0 ) {
    if ( $post = get_post($post) ) {
        $post_gallery = get_post_gallery($post, false);
        if ( ! empty($post_gallery) ) {
            $shortcode = "[gallery";
            foreach ( $post_gallery as $att => $val ) {
                if ( $att !== 'src') {
                    if ( $att === 'size') $val = "full";        // Set custom attribute value
                    $shortcode .= " ". $att .'="'. $val .'"';   // Add attribute name and value ( attribute="value")
                }
            }
            $shortcode .= "]";
            return $shortcode;
        }
    }
}

// Example of how to use: 
echo do_shortcode( get_shortcode_gallery() );

Function to delete First gallery shortcode from Post content:

// Deletes first gallery shortcode and returns content
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 ($pos !== false)
                    return substr_replace( $content, '', $pos, strlen($shortcode[0]) );
            }
        }
    }
    return $content;
}

// Example of how to use:
$content = strip_shortcode_gallery( get_the_content() );                                        // Delete first gallery shortcode from post content
$content = str_replace( ']]>', ']]>', apply_filters( 'the_content', $content ) );            // Apply filter to achieve the same output that the_content() returns
echo $content;
like image 131
BHUSHAN Avatar answered Feb 23 '23 20:02

BHUSHAN


just use the get_shortcode_regex():

<?php
$pattern = get_shortcode_regex();
preg_match_all('/'.$pattern.'/s', $post->post_content, $shortcodes);
?>

that will return an array of all the shortcodes in your content, which you can then output wherever you feel, like so:

<?php
echo do_shortcode($shortcodes[0][1]);
?>

similarly, you could use the array entries to check for shortcodes in your content and remove them with str_replace():

<?php
$content = $post->post_content;
$content = str_replace($shortcodes[0][1],'',$content);
?>
like image 31
mroncetwice Avatar answered Feb 23 '23 22:02

mroncetwice