不幸的是,背景get_template_part()
函数没有任何合适的过滤器来实现所需的功能。可以使用get_template_part_{$slug}
动作挂钩注入模板部分,但是,在不更改主题或子主题的情况下,仍将添加原始模板部分。因此,这样您将无法替换现有的模板部件。
但是,您可以通过以下选项之一实现所需的结果:
选项1:如果您只想更改paper
自定义post类型,然后您可以简单地使用WordPress生成的CSS类。WordPress中的任何标准主题都将生成$post_type
和type-{$post_type}
帖子内容的CSS类。例如,自定义帖子类型paper
将会有paper
&;type-paper
CSS类和常规post
将会有post
和type-post
CSS类。此外,主页将具有home
正文中的CSS类。So目标paper
在主页中,您可以使用以下CSS规则:
body.home .type-paper {
/* Custom CSS for paper entries in the home page */
}
选项2:修改CSS类:如果默认CSS类对您来说不够,您还可以使用
post_class
插件中的过滤器挂钩。像这样:
add_filter( \'post_class\', \'paper_post_class\' );
function paper_post_class( $class ) {
if ( get_post_type() === \'paper\' && is_home() ) {
// remove these classes
$remove = array( \'css-class-to-remove\', \'another-class-to-remove\' );
$class = array_diff( $class, $remove );
// add these classes
$add = array( \'custom-paper\', \'my-paper-class\' );
$class = array_merge( $add, $class );
}
return $class;
}
这样,您就可以删除不需要的CSS类
paper
条目并添加您想要的新CSS类
paper
不修改主题文件的条目。然后使用这些CSS类更改
paper
根据需要输入。
选项3:修改模板(&H);模板部分如果仅针对CSS类无法更改所需的样式,那么也可以从插件中更改模板部分。但是,由于替换模板零件添加了get_template_part()
使用挂钩是不可能的,您必须以某种方式更改模板,以便可以修改get_template_part()
从插件内部调用。
为此,您可以针对pre_get_posts
挂钩功能和使用template_include
过滤器挂钩可修改主页模板,如下所示:
function add_custom_post_types_to_query( $query ) {
if ( is_home() && $query->is_main_query() ) {
$query->set( \'post_type\', array( \'post\', \'paper\' ) );
// now also change the home page template, but only when this condition matches
add_filter( \'template_include\', \'wpse258844_custom_template\', 999 );
}
}
add_action( \'pre_get_posts\', \'add_custom_post_types_to_query\' );
然后使用以下代码(根据需要进行修改):
// for better file management, use a separate "theme-{$theme_name_slug}" directory within your plugin directory
// so if the active theme name is "OnePress", the directory name will be "theme-onepress"
// This will save you a ton of headache if you change the theme,
// as different themes may use different function calls within the templates, which other themes may not have
define( \'wpse258844_TEMPLATE_DIR\', plugin_dir_path( __FILE__ ) . sprintf( \'theme-%s/\', sanitize_title( wp_get_theme() ) ) );
function wpse258844_custom_template( $template ) {
// this file will replace your homepage template file
$index_paper = wpse258844_TEMPLATE_DIR . \'custom-home.php\';
// file_exists() check may need clearing stat cache if you change file name, delete the file etc.
// Once you are done, comment out or remove clearstatcache(); in production
clearstatcache();
if ( file_exists( $index_paper ) ) {
$template = $index_paper;
}
return $template;
}
function wpse258844_get_template_part( $slug, $name = null ) {
if( get_post_type() === \'paper\' ) {
// just to be consistant with get_template_part() function
do_action( "get_template_part_{$slug}", $slug, $name );
$located = \'\';
$name = (string) $name;
// file_exists() check may need clearing stat cache if you change file name, delete the file etc.
// Once you are done, comment out or remove clearstatcache(); in production
clearstatcache();
if ( \'\' !== $name && file_exists( wpse258844_TEMPLATE_DIR . "{$slug}-{$name}.php" ) ) {
$located = wpse258844_TEMPLATE_DIR . "{$slug}-{$name}.php";
}
else if ( file_exists( wpse258844_TEMPLATE_DIR . "{$slug}.php" ) ) {
$located = wpse258844_TEMPLATE_DIR . "{$slug}.php";
}
if ( \'\' != $located ) {
load_template( $located, false );
return;
}
}
get_template_part( $slug, $name );
}
一旦插件中包含了上述代码(请阅读代码中的注释):
在插件目录中创建一个新目录,以保存主题模板文件,例如。theme-onepress
. 如果您想用不同的主题测试设计更改(我想这是所有这些混乱的主要目的),这将在将来对您有所帮助。
在新的theme-onepress
目录中,创建一个名为custom-home.php
. 从主题复制主页模板的代码(可能是index.php
, 或home.php
或者您的主题用于主页模板的任何内容)。
现在在custom-home.php
更改的所有调用get_template_part
到wpse258844_get_template_part
. 无需更改参数,只需更改函数名。wpse258844_get_template_part()
上述代码中的函数与相同get_template_part()
如果在插件中找不到自定义模板部分,则返回默认行为theme-{$theme_name_slug}
(例如。theme-onepress
) 目录
最后,在插件的theme-{$theme_name_slug}
目录
例如,如果最初的调用是get_template_part( \'template-parts/content\', get_post_format() )
你想替换content.php
模板部分,然后只需放置一个名为content.php
在插件中theme-onepress/template-parts
目录也就是说theme-onepress
目录的行为类似于模板部件的子主题,即简单的插入式替换。