একটি প্লাগইনে একটি কাস্টম পোস্ট ধরণের জন্য একটি কাস্টম সংরক্ষণাগার পৃষ্ঠা তৈরি করুন


11

আমি একটি প্লাগইন লিখছি যা "my_plugin_lesson" নামে একটি কাস্টম পোস্ট টাইপ তৈরি করে:

$args = array (
    'public' => true,
    'has_archive' => true,
    'rewrite' => array('slug' => 'lessons', 'with_front' => false)
);
register_post_type ('my_plugin_lesson', $args);

কাস্টম পোস্ট ধরণের একটি সংরক্ষণাগার রয়েছে এবং সংরক্ষণাগারটির URL টি হ'ল:

http://example.com/lessons

আমি এই সংরক্ষণাগারটির চেহারাটি কাস্টমাইজ করতে চাই; আমি পোস্টগুলি স্ট্যান্ডার্ড ওয়ার্ডপ্রেস ব্লগ পোস্ট সংরক্ষণাগারের চেয়ে টেবিল বিন্যাসে তালিকাবদ্ধ করতে চাই। আমি বুঝতে পারি যে থিমটিতে archive-my_plugin_lesson.phpফাইল তৈরি করে একটি কাস্টম সংরক্ষণাগার টেম্পলেট তৈরি করা যেতে পারে ; তবে, আমি প্লাগইনটি যে কোনও থিমের সাথে কাজ করতে চাই।

থিম ফাইলগুলি যুক্ত না করে বা সংশোধন না করে আমি কীভাবে সংরক্ষণাগার পৃষ্ঠার বিষয়বস্তু পরিবর্তন করতে পারি?

সম্পাদনা: আমি বুঝতে পারি যে আমি archive_templateফিল্টার হুক ব্যবহার করতে পারি । তবে, এই সমস্তটি থিম টেমপ্লেটটি প্রতিস্থাপন করে, যা এখনও থিম-নির্দিষ্ট হওয়া দরকার। উদাহরণস্বরূপ, প্রায় প্রতি থিম টেমপ্লেট প্রয়োজন হবে get_header, get_sidebarএবং get_footerফাংশন, কিন্তু কি বিষয়বস্তুর আইডি উচিত <div>হবে? এটি প্রতিটি থিমে আলাদা।

আমি যা করতে চাই তা হ'ল সামগ্রীটি আমার নিজস্ব সামগ্রীর সাথে প্রতিস্থাপন করা এবং সেটি আমার কাস্টম পোস্টের জন্য সংরক্ষণাগার পৃষ্ঠার জায়গায় ব্যবহার করুন।

উত্তর:


12

আপনার যা দরকার তা হ'ল template_includeফিল্টারটি হুবহু এবং নির্বাচিতভাবে আপনার টেম্পলেটটি প্লাগইনের ভিতরে লোড করা।

একটি ভাল অনুশীলন হিসাবে, আপনি যদি আপনার প্লাগইন বিতরণ করার পরিকল্পনা করেন তবে প্লাগইন সংস্করণটি ব্যবহার না করে আপনার থিমটিতে archive-my_plugin_lesson.php(বা সম্ভবত myplugin/archive-lesson.php) উপস্থিত রয়েছে কিনা তা পরীক্ষা করা উচিত ।

প্লাগইন কোডটি সম্পাদনা না করেই ব্যবহারকারীদের পক্ষে থিম (বা চাইল্ড থিম) এর মাধ্যমে টেমপ্লেটটি প্রতিস্থাপন করা সহজ।

জনপ্রিয় প্লাগইন যেমন WooCommmerce, কেবল একটি নাম বলার জন্য এটি ব্যবহৃত পদ্ধতি say

add_filter('template_include', 'lessons_template');

function lessons_template( $template ) {
  if ( is_post_type_archive('my_plugin_lesson') ) {
    $theme_files = array('archive-my_plugin_lesson.php', 'myplugin/archive-lesson.php');
    $exists_in_theme = locate_template($theme_files, false);
    if ( $exists_in_theme != '' ) {
      return $exists_in_theme;
    } else {
      return plugin_dir_path(__FILE__) . 'archive-lesson.php';
    }
  }
  return $template;
}

কোডেক্সের জন্য আরও তথ্য


এটি এখনও থিমের টেম্পলেট ফাইলটি প্রতিস্থাপন করে, তাই না? আমি আমার প্লাগইননের সংরক্ষণাগার-পাঠ.এফপি ফাইলটিতে কী রাখি? প্রতিটি থিমের সাথে কাজ করার জন্য এটি আলাদা হওয়া দরকার। এমনকি ডিফল্ট "বিশ" থিমগুলি ডিভি / বিভাগের ধারকগুলি কী কী সামগ্রীর চারপাশে থাকে সে বিষয়ে একমত হয় না।
বেন মিলার - মনিকা মনে রাখবেন

7

আপনি archive_templateনীচের স্কিমটি ব্যবহার করে কোনও থিমের সংরক্ষণাগার টেমপ্লেটের বিষয়বস্তু প্রসেস করতে হুক ব্যবহার করতে পারেন তবে স্পষ্টতই আপনি কেবল থিমগুলির একটি ভগ্নাংশ প্রক্রিয়া করতে সক্ষম হবেন, প্রদত্ত যে কোনও টেমপ্লেট মূলত কোনও পুরানো জিনিস থাকতে পারে ।

প্রকল্পটি হ'ল ফিল্টারটিতে টেমপ্লেটটি স্ট্রিংয়ের ( $tpl_str) এ লোড করা archive_template, আপনার সামগ্রীর বিকল্প তৈরি করা, স্ট্রিংটি অন্তর্ভুক্ত করা (ট্রিকটি ব্যবহার করে eval( '?>' . $tpl_str );), এবং একটি ফাঁকা ফাইল ফিরিয়ে includeআনুন যাতে "wp-অন্তর্ভুক্ত / টেম্পলেট-লোডার.পিপি" একটি অপ-বিকল্প হয়ে ওঠে।

নীচে আমি প্লাগইনে ব্যবহার করি কোডটির একটি হ্যাক সংস্করণ রয়েছে, যা "ক্লাসিক" টেম্পলেটগুলিকে লক্ষ্য করে যেগুলি ব্যবহার করে get_template_partএবং সংরক্ষণাগার থেকে একক টেমপ্লেট প্রসেসিংয়ের সাথে বেশি উদ্বেগযুক্ত তবে আপনাকে শুরু করতে সহায়তা করা উচিত। সেটআপটি হ'ল প্লাগইনটিতে "টেমপ্লেটস" নামে একটি উপ-ডিরেক্টরি রয়েছে যা একটি ফাঁকা ফাইল ("নাল। পিএফপি") এবং সামগ্রী টেম্পলেট (যেমন "সামগ্রী-একক-পোস্ট টাইপ 1.php", "সামগ্রী-সংরক্ষণাগার-পোস্ট টাইপ 1.php") ধারণ করে পাশাপাশি একটি একক ক্ষেত্রে "পিছনে পিছনে টেমপ্লেট" "একক। পিএফপি", এবং get_template_partএই ডিরেক্টরিতে দেখায় এর একটি কাস্টম সংস্করণ ব্যবহার করে ।

define( 'MYPLUGIN_FOLDER', dirname( __FILE__ ) . '/' );
define( 'MYPLUGIN_BASENAME', basename( MYPLUGIN_FOLDER ) );

add_filter( 'single_template', 'myplugin_single_template' );
add_filter( 'archive_template', 'myplugin_archive_template' );

function myplugin_single_template( $template ) {
    static $using_null = array();

    // Adjust with your custom post types.
    $post_types = array( 'posttype1', );

    if ( is_single() || is_archive() ) {
        $template_basename = basename( $template );
        // This check can be removed.
        if ( $template == '' || substr( $template_basename, 0, 4 ) == 'sing' || substr( $template_basename, 0, 4 ) == 'arch' ) {
            $post_type = get_post_type();
            $slug = is_archive() ? 'archive' : 'single';
            if ( in_array( $post_type, $post_types ) ) {
                // Allow user to override.
                if ( $single_template = myplugin_get_template( $slug, $post_type ) ) {
                    $template = $single_template;
                } else {
                    // If haven't gone through all this before...
                    if ( empty( $using_null[$slug][$post_type] ) ) {
                        if ( $template && ( $content_template = myplugin_get_template( 'content-' . $slug, $post_type ) ) ) {
                            $tpl_str = file_get_contents( $template );
                            // You'll have to adjust these regexs to your own case - good luck!
                            if ( preg_match( '/get_template_part\s*\(\s*\'content\'\s*,\s*\'' . $slug . '\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'content\'\s*,\s*get_post_format\s*\(\s*\)\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'content\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE )
                            || preg_match( '/get_template_part\s*\(\s*\'[^\']+\'\s*,\s*\'' . $slug . '\'\s*\)/', $tpl_str, $matches, PREG_OFFSET_CAPTURE ) ) {
                                $using_null[$slug][$post_type] = true;
                                $tpl_str = substr( $tpl_str, 0, $matches[0][1] ) . 'include \'' . $content_template . '\'' . substr( $tpl_str, $matches[0][1] + strlen( $matches[0][0] ) );
                                // This trick includes the $tpl_str.
                                eval( '?>' . $tpl_str );
                            }
                        }
                    }
                    if ( empty( $using_null[$slug][$post_type] ) ) {
                        // Failed to parse - look for fall back template.
                        if ( file_exists( MYPLUGIN_FOLDER . 'templates/' . $slug . '.php' ) ) {
                            $template = MYPLUGIN_FOLDER . 'templates/' . $slug . '.php';
                        }
                    } else {
                        // Success! "null.php" is just a blank zero-byte file.
                        $template = MYPLUGIN_FOLDER . 'templates/null.php';
                    }
                }
            }
        }
    }
    return $template;
}

function myplugin_archive_template( $template ) {
    return myplugin_single_template( $template );
}

প্রথা get_template_part:

/*
 * Version of WP get_template_part() that looks in theme, then parent theme, and finally in plugin template directory (sub-directory "templates").
 * Also looks initially in "myplugin" sub-directory if any in theme and parent theme directories so that plugin templates can be kept separate.
 */
function myplugin_get_template( $slug, $part = '' ) {
    $template = $slug . ( $part ? '-' . $part : '' ) . '.php';

    $dirs = array();

    if ( is_child_theme() ) {
        $child_dir = get_stylesheet_directory() . '/';
        $dirs[] = $child_dir . MYPLUGIN_BASENAME . '/';
        $dirs[] = $child_dir;
    }

    $template_dir = get_template_directory() . '/';
    $dirs[] = $template_dir . MYPLUGIN_BASENAME . '/';
    $dirs[] = $template_dir;
    $dirs[] = MYPLUGIN_FOLDER . 'templates/';

    foreach ( $dirs as $dir ) {
        if ( file_exists( $dir . $template ) ) {
            return $dir . $template;
        }
    }
    return false;
}

সম্পূর্ণতার জন্য এখানে "সিঙ্গল.এফপি" ফলের পিছনে ফিরে আসে, এটি কাস্টমটি ব্যবহার করে get_template_part:

<?php
get_header(); ?>

    <div id="primary" class="content-area">
        <div id="content" class="clearfix">
            <?php while ( have_posts() ) : the_post(); ?>

            <?php if ( $template = myplugin_get_template( 'content-single', get_post_type() ) ) include $template; else get_template_part( 'content', 'single' ); ?>

                <?php
                    // If comments are open or we have at least one comment, load up the comment template
                    if ( comments_open() || '0' != get_comments_number() ) :
                        comments_template();
                    endif;
                ?>

            <?php endwhile; ?>

        </div><!-- #content -->
    </div><!-- #primary -->

<?php get_sidebar(); ?>
<?php get_footer(); ?>

1

আমি একই প্রশ্নটি নিয়ে ভাবছিলাম, এবং এটিই হাইপোথেটিকাল সমাধান আমি নিয়ে এসেছি:

  • প্লাগইনের মধ্যে একটি শর্টকোড তৈরি করুন যা আপনার আর্কাইভ লুপটি আপনার পছন্দ মতো করে দেয়।
  • কাস্টম পোস্ট প্রকার তৈরি করার সময়, 'সংরক্ষণাগার' বিকল্পটি সক্ষম করবেন না।
  • এমন স্টাইলশিট যুক্ত করুন যা আপনার লুপ সামগ্রীর সমস্ত স্টাইলকে নিয়ন্ত্রণ করে।

প্লাগইন অ্যাক্টিভেশনের পরে ডাব্লুপি_ইন্টার_পোস্ট ব্যবহার করে একটি পোস্ট তৈরি করুন নামটি পোস্টের ধরণের এবং সামগ্রীটি শর্টকোড হিসাবে রয়েছে।

আপনি অতিরিক্ত স্টাইল বিবেচনার জন্য শর্টকোডে বিকল্প সরবরাহ করতে পারেন, বা থিম নির্দিষ্ট বা কাস্টম শৈলীর সাথে মেলে পোস্ট পাত্রে ক্লাস যুক্ত করতে পারেন। ব্যবহারকারী পৃষ্ঠাটি সম্পাদনা করে লুপের আগে / পরে অতিরিক্ত সামগ্রী যুক্ত করতে পারেন।


যদিও আমি ওপি নই, আমি একই সমস্যার সমাধান খুঁজছিলাম। আমি আপনার অনুমানমূলক সমাধানটি অনুসরণ করেছি এবং আমি এখন নিশ্চিত করতে পারি যে এটি অনুশীলনেও কাজ করে।
লুসিও ক্রুসকা

আরে দুর্দান্ত! খুশী এটি কারওর জন্য কার্যকর ছিল। আমি এই সম্পর্কে সম্পূর্ণ ভুলে গিয়েছিলাম।
স্কাইশ্যাব

0

আপনি ফিল্টার ব্যবহার করতে পারেন single_templateকোডেক্স থেকে নেওয়া একটি প্রাথমিক উদাহরণ :

function get_custom_post_type_template($single_template) {
     global $post;

     if ($post->post_type == 'my_post_type') {
          $single_template = dirname( __FILE__ ) . '/post-type-template.php';
     }
     return $single_template;
}

add_filter( "single_template", "get_custom_post_type_template" );

আমি মনে করি একটি সংরক্ষণাগার টেমপ্লেটের ফিল্টার হুক archive_template, তবে আমি মনে করি না যে এটি করার চেষ্টা করছি তার জন্য এটি কাজ করবে। আমি আরও তথ্য দিয়ে আমার প্রশ্ন সম্পাদনা করেছি।
বেন মিলার - মনিকা 24
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.