विभाजन सामग्री और गैलरी


22

क्या पोस्ट कंटेंट और गैलरी शॉर्ट कोड को विभाजित करने का एक तरीका है। मैं अपनी सामान्य सामग्री के बाहर गैलरी प्रदर्शित करना चाहता हूं, चाहे वह कहां या कहां रखी हो। मैं शोर्टकोड प्राप्त करने के लिए इसका उपयोग कर सकता हूं:

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

लेकिन यह काम नहीं करता है अगर गैलरी लघु कोड पहला उदाहरण नहीं है। क्या मेरी सामग्री और गैलरी को पूरी तरह से विभाजित करने का कोई तरीका है?


संपादित करें: मेरे पास एक अर्ध-समाधान है लेकिन इसके बारे में जाने के लिए एक लंबे घुमावदार रास्ते की तरह लगता है। यह पहली बार पोस्ट में पहला शोर्ट पकड़ लेता है (जिसे मुझे केवल "गैलरी" शोर्ट चाहिए) के बाद से तय करना होगा, तब कंटेंट से सभी शोर्टकोड को हटा देता है (फिर से, वास्तव में मैं जो करना चाहता हूं वह नहीं करता।

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

# 2 संपादित करें - ठीक है, मैं केवल पोस्ट में गैलरी शॉर्टकोड प्राप्त करने में सक्षम हूं। मैंने गैलरी शोर्ट फॉर्म को निकालने के लिए एक फिल्टर भी जोड़ा है the_content()- समस्या यह है कि इसके पोस्ट करने के बाद से शॉर्टकोड को हटाना जरूरी नहीं है, लेकिन इसकी मुझे "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); 

सूचित करते रहना

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

लूप में यह मेरा लघु कोड ट्वाइस लौटा देगा (मैं एक ही पृष्ठ पर दो बार, दो बार लूप किया जाना चाहिए - इसलिए यह do_shortcode () नहीं चल रहा है)। यकीन नहीं है कि क्यों।


1
क्या आपने गैलरी के लिए एक अलग WYSYWIG मेटा बॉक्स को जोड़ने पर विचार किया है? तब आप हमेशा उसके बाद कॉल कर सकते थे the_content()। ट्रिकियर अगर वहाँ पहले से ही इस तरह के कई पृष्ठ हैं, हालांकि।
21

मैं सहमत हूं कि यह एक संभावना है, लेकिन मैं एक और बड़े संपादक की आवश्यकता से बचने की कोशिश कर रहा था - जितना संभव हो उतना सरल और सीधे आगे बढ़ाने की कोशिश कर रहा हूं। काश मैं (कोर्स के एक प्लगइन के बिना) बस एक गैलरी गैलरी या कुछ इसी तरह की है।
Howdy_McGee

जवाबों:


24

किसी को भी खोलें जो इसे सरल बना सकता है, लेकिन यहां मेरे लिए जो काम आया वह मेरे लिए है।

पहली बात सबसे पहले - get_post_gallery()लूप शुरू होते ही, गैलरी का उपयोग करें ,

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

संसाधन:

स्टैक ओवरफ़्लो:

मैं मूल रूप से क्या जा रहा था, जो उम्मीद के मुताबिक काम नहीं कर रहा था:


4

कोर शोर्ट नियमित एक्सप्रेशन

मूल रूप से हम ऐसा रेगेक्स के साथ कर सकते हैं - वास्तव में यहां तक ​​कि रेगेक्स द्वारा कोर द्वारा प्रदान किया गया get_shortcode_regex()

सबसे पहले हमें शोर्ट टैग्स को हथियाने और एक रेगेक्स बनाने की आवश्यकता है। मुख्य कार्य get_shortcode_regex()दुख की बात है कि हम एक तर्क के साथ फेंकने का कोई मौका नहीं देते हैं, इसलिए हमें एक regex के साथ छोड़ दिया जाएगा जो प्रत्येक और हर शोर्ट से मेल खाता है, जो अवांछित है क्योंकि हम केवल [gallery]शोर्ट को लक्षित करना चाहते हैं ।

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

सभी दीर्घाओं को पकड़ो

आगे हमें एक रेगेक्स की आवश्यकता है जो सभी दीर्घाओं को पकड़ता है। इसलिए हम कॉल कर रहे हैं preg_match_all()क्योंकि यह एक 0इंडेक्स के साथ सरणी के रूप में गैलरी शोर्ट के लिए सभी मैचों को वापस कर देगा (बाकी आंशिक मैच होंगे और इसे अनदेखा किया जा सकता है)।

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

अब $galleries[0]गैलरी शोर्ट टैग की एक सरणी रखती है।

गैलरी के बिना सामग्री

अगली बात यह है कि हमें [gallery]सामग्री से सभी शॉर्टकोड हटाने की आवश्यकता है। हम उसी रेगेक्स का फिर से उपयोग करेंगे और उस पर चलेंगे get_the_content()। निश्चित रूप से हम the_contentफ़िल्टर लागू करते हैं क्योंकि शॉर्टकोड रेंडर के समय कॉलबैक के माध्यम से जोड़ा जा सकता था।

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

$contentचर अब हमारे सामग्री रखती है।

सामग्री को बदलने के लिए उदाहरण कॉलबैक

या: आप सामग्री को दीर्घाओं और बाकी पोस्ट में कैसे विभाजित कर सकते हैं

हम आसानी से कॉलबैक के दौरान सामग्री को अपनी नई सामग्री से बदल सकते हैं:

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

जो पहले सभी दीर्घाओं को जोड़ देगा, फिर हमारी सामग्री को दीर्घाओं के बिना जोड़ देगा, दोनों एक क्षैतिज नियम से अलग हो जाएंगे। यह सिर्फ एक शुरुआती बिंदु है।


wordpress.stackexchange.com/questions/193511/… के रूप में एक अलग दृष्टिकोण का उपयोग कर । जब मैं आपके कोड की कोशिश करता हूं तो मुझे php त्रुटियाँ मिलती हैं - क्या आप कृपया एक बार देख सकते हैं?
Adeerlike

कौन सा कोड? क्या त्रुटियां हैं? विस्तार से, कृपया। यह विकास है, खेलों का अनुमान लगाना नहीं।
केसर

लिंक में कोड
अदन

2

यह sooo जटिल नहीं होना चाहिए। नीचे दिए गए कोड को इच्छा के आधार पर एक-दो लाइनों तक छोटा किया जा सकता है।

दृष्टिकोण 1. पोस्ट सामग्री से गैलरी एक सहित सभी शॉर्टकोड को हटाकर स्वच्छ पोस्ट सामग्री प्राप्त करें।

एनबी: अन्य सभी शॉर्टकोड पोस्ट से हटा दिए जाएंगे। यदि आप वहां कस्टम शॉर्टकोड नहीं रखते हैं, तो दृष्टिकोण आपके लिए है।

मान लें कि आप WP लूप में हैं

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

मान लें कि आप बाहर हैं

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

दृष्टिकोण 2. केवल [gallery]शोर्ट निकालें , अन्य सभी शॉर्टकोड को अंदर रखें।

शोर्टकोड [gallery]कैसा दिखता है, यह आंतरिक बोध पर निर्भर करता है , जिसे WP टीम द्वारा बदला जा सकता है, इसलिए शायद भविष्य के प्रमाण के रूप में 1 दृष्टिकोण के रूप में नहीं:

WP लूप में

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

इसके बाहर

$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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.