বিভক্ত সামগ্রী এবং গ্যালারী


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()। ট্রিকিয়ার যদি ইতিমধ্যে এর মতো অনেকগুলি পৃষ্ঠা থাকে তবে।
ঘোস্টটোস্ট

আমি সম্মতি জানাই যে এটি একটি সম্ভাবনা, তবে আমি অন্য বড় সম্পাদকের প্রয়োজনীয়তা এড়াতে চেষ্টা করছিলাম - এটি যতটা সম্ভব সহজ এবং সরলভাবে এগিয়ে দেওয়ার চেষ্টা করছিলাম। আমি আশা করি আমি (অবশ্যই প্লাগইন ছাড়াই) একটি অ্যাড গ্যালারী মেটাবক্স বা অনুরূপ কিছু পেতে পারি।
হাওডি_এমসিজি

উত্তর:


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

সম্পদ:

Stackoverflow:

আমি মূলত যা যাচ্ছিলাম, যা প্রত্যাশার মতো কার্যকর হয়নি:


4

কোর শর্ট কোড নিয়মিত এক্সপ্রেশন

মূলত আমরা এটি একটি রেইজেক্সের সাহায্যে করতে পারি - আসলে এমনকি কোর দ্বারা সরবরাহিত রেজেক্সের সাথেও get_shortcode_regex()

প্রথমে আমাদের শর্টকোড ট্যাগগুলি গ্রহণ করতে হবে এবং একটি রেইজেক্স তৈরি করতে হবে। মূল ফাংশনটি get_shortcode_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/... । আমি যখন আপনার কোডটি চেষ্টা করি তখন আমি পিএইচপি ত্রুটি পাই - আপনি কি দয়া করে একবার দেখে নিতে পারেন?
অ্যাডারলিক

কোন কোড? কি ত্রুটি? বিস্তারিত, দয়া করে। এটি গেম অনুমান না করে উন্নয়ন।
কায়সার

লিঙ্কে কোড অ্যাডন বিশদ বিবরণ> ওয়ার্ডপ্রেস.স্ট্যাকেক্সেঞ্জার.কম
সেকশনস

2

এটি খুব জটিল হওয়া উচিত নয়। নীচের কোডটি ইচ্ছামত কয়েক লাইন ধরে সংক্ষিপ্ত করা যেতে পারে।

দৃষ্টিভঙ্গি 1. পোস্ট সামগ্রী থেকে গ্যালারী সহ সমস্ত শর্টকোড সরিয়ে পরিষ্কার পোস্টের সামগ্রী পান।

এনবি: অন্যান্য সমস্ত শর্টকোড পোস্ট থেকে সরানো হবে। আপনি যদি কাস্টম শর্টকোডগুলি সেখানে না রাখেন তবে পন্থাটি আপনার জন্য।

ধরুন আপনি ডাব্লুপি লুপে আছেন

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

পদ্ধতির ২. কেবলমাত্র [gallery]শর্টকোড সরান , অন্যান্য সমস্ত শর্টকোড ভিতরে রাখুন।

[gallery]শর্টকোডটি কেমন লাগে তার অভ্যন্তরীণ উপলব্ধির উপর নির্ভর করে , যা ডাব্লুপি দলের দ্বারা পরিবর্তন করা যেতে পারে, তাই সম্ভবত 1 ম পদ্ধতির মতো ভবিষ্যতের প্রমাণ নয়:

ডাব্লুপি লুপে

$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);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.