आप archive_template
नीचे दी गई योजना का उपयोग करके किसी थीम के आर्काइव टेम्प्लेट की सामग्री को संसाधित करने के लिए हुक का उपयोग कर सकते हैं , लेकिन जाहिर है कि आप कभी भी वहाँ से बाहर के विषयों के एक अंश को संसाधित करने में सक्षम होंगे, यह देखते हुए कि कोई टेम्पलेट मूल रूप से किसी पुरानी चीज़ को शामिल कर सकता है। ।
योजना फिल्टर $tpl_str
में टेम्पलेट को एक स्ट्रिंग ( ) में लोड करने के लिए है archive_template
, अपनी सामग्री को प्रतिस्थापित करें, स्ट्रिंग को शामिल करें (ट्रिक का उपयोग करके eval( '?>' . $tpl_str );
), और फिर एक खाली फ़ाइल लौटाएं ताकि include
"wp- / /-loader.php" शामिल हो। एक नहीं सेशन बन जाता है।
नीचे एक प्लगइन में उपयोग किए गए कोड का हैक किया गया संस्करण है, जो "क्लासिक" टेम्प्लेट को लक्षित करता है जो कि get_template_part
संग्रह की तुलना में एकल टेम्प्लेट के प्रसंस्करण के साथ उपयोग करते हैं और अधिक चिंतित हैं, लेकिन आपको आरंभ करने में मदद करनी चाहिए। सेटअप यह है कि प्लगइन में "टेम्प्लेट" नामक एक उपनिर्देशिका है जो एक रिक्त फ़ाइल ("null.php") और सामग्री टेम्प्लेट (उदाहरण के लिए "सामग्री-एकल- posttype1.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(); ?>