可以通过在保存贴文(post)时使用save_post
钩子来设置贴文格式(post format)。而由于在贴文保存过程中要对贴文格式进行设置,可能会引发无限循环,因此我们需要在函数内部使用remove_action
和add_action
来避免这种情况。
以下以indieblocks_like
、indieblocks_note
之二则贴文类型(post type)为例,举出需要添加到functions.php
文件(或者Snippets插件)的代码:
function set_default_post_format( $post_id, $post ) {
// 如果这是一次自动保存,要跳过
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
// 针对不同的 post type 设置不同的默认 post format
switch( $post->post_type ) {
case 'indieblocks_like':
$format = 'link';
break;
case 'indieblocks_note':
$format = 'status';
break;
default:
return;
}
// 检查当前 post format,如果未设置,使用默认值
if ( ! get_post_format( $post_id ) ) {
// 在设置 post format 之前,移除这个函数,以防止无限循环
remove_action( 'save_post', 'set_default_post_format', 10, 2 );
set_post_format( $post_id, $format );
// 设置完 post format 后,再次添加这个函数
add_action( 'save_post', 'set_default_post_format', 10, 2 );
}
}
add_action( 'save_post', 'set_default_post_format', 10, 2 );
这个函数将在每次保存贴文时运行,检查贴文格式是否已经设置,如果没有,它会为indieblocks_like
贴文类型设置为link
格式,为indieblocks_note
贴文类型设置为status
格式。
上述代码代码可以满足以下需求:除非特意在编辑过程中指定了贴文格式,否则就按照设定的默认贴文格式进行。
因为在set_default_post_format
函数中,首先使用get_post_format
函数检查了贴文是否已经有了贴文格式。如果贴文已经有了贴文格式(这就意味着在编辑过程中已经指定了贴文格式),那么函数就会立即返回,不会覆盖已经设定的贴文格式。只有在贴文没有设定贴文格式的时候,才会根据indieblocks_like
和indieblocks_note
设置默认的贴文格式。
按,为此,也需要保证主题已经支持所要使用的贴文格式。可以通过以下代码启用支持:
add_theme_support( 'post-formats', array( 'link', 'status' ) );