不存在帖子时覆盖ARCHIVE_TEMPLATE

时间:2018-11-28 作者:hsimah

我有一个插件,其中包含一个PHP模板single_templatearchive_template 对于多个帖子类型。我正在这个模板中加载客户端应用程序,这就是为什么我只需要为所有四个变体使用一个模板的原因。

我的代码是:

add_filter( \'single_template\', \'react_template\' );
add_filter( \'archive_template\', \'react_template\' );

function react_template( $template ) {

    global $post;
    if ( $post->post_type == \'tutorial\' || $post->post_type == \'dashboard\' ) {
        if ( file_exists( PLUGIN_DIR . \'templates/learning.php\' ) ) {
            return PLUGIN_DIR . \'templates/learning.php\';
        }
    }

    return $template;
}
这完全符合我的需要。但是,如果tutorialdashboard 类型我收到错误,因为$post 为空。

这没什么大不了的,因为在生产中,系统中总会有很多帖子,但这让我很烦。我不想为每种类型都指定一个命名模板。在没有帖子的情况下,有没有办法让我的归档模板工作?

1 个回复
最合适的回答,由SO网友:Nathan Johnson 整理而成

实现这一点的一种方法是使用pre_get_posts 有条件地添加single_templatearchive_template 过滤器。

namespace StackExchange\\WordPress;

/**
 * Add filters for `single_template`, and `archive_template` for the tutorial and 
 * dashboard archives.
 */
function pre_get_posts( $query )
{
  if( is_singular() )
  {
    $post_type = get_post_type();
    if ( \'tutorial\' === $post_type  || \'dashboard\' === $post_type) )
    {
      add_filter( \'single_template\', __NAMESPACE__ . \'\\react_template\' );
      return $query;
    }
  }

  if ( ! is_post_type_archive( [ \'tutorial\', \'dashboard\' ] ) )
  {
    return $query;
  }
  if( ! isset( $query->query[ \'post_type\' ] )
  {
    return $query;
  }

  $post_type = $query->query[\'post_type\'];
  if ( \'tutorial\' === $post_type  || \'dashboard\' === $post_type) )
  {
    add_filter( \'archive_template\', __NAMESPACE__ . \'\\react_template\' );
  }
  return $query;
}
add_action( \'pre_get_posts\', __NAMESPACE__ . \'\\pre_get_posts\' );

/**
 * Return the React Template, if it exists
 */
function react_template( $template )
{
  if ( file_exists( PLUGIN_DIR . \'templates/learning.php\' ) )
  {
    return PLUGIN_DIR . \'templates/learning.php\';
  }
  return $template;
}

结束