告诉WordPress显示单页而不是档案

时间:2013-09-09 作者:somebody

因此,我在url中有多个自定义参数,当查询达到3个参数时(例如。index.php?post_type=foo&<param-1>=<val-1>&<param-2>=<val-2>&<param-3>=<val-3>) 可以有一个帖子,也可以没有。而不是显示存档(archive-foo.php) 通过这篇文章,我希望wordpress显示文章本身(例如。single-foo.php). 当然我可以在archive-foo.php 并从那里重定向到相应的帖子,但在这种情况下,我“浪费”了显示存档的整个查询。

那么,当归档文件只包含一条记录时,有没有办法通过操纵主查询(使用functions.php 并通过add_action(\'pre_get_posts\', \'<func-name>\'))?

粗略示例:

add_action(\'pre_get_posts\', \'custom_func\')
function custom_func($query) {
    if($query->get(\'param-1\')) {
        // Change some $query params, but still show archive
        if($query->get(\'param-2\')) {
            // Change some $query params, but still show archive
            if($query->get(\'param-3\')) {
                // There is 1 post or none for sure
                // Alter the query to something like
                $wpdb->query(\'SELECT * FROM wp_posts WHERE param1=val1 AND param2=val2 ...\');
                // force to load a single page with the results passed to $post object
            }
        }
    }
}

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

这是一个粗过滤器:

add_filter(
  \'template_include\',
  function($template) {
    global $wp_query;
    if (1 == $wp_query->found_posts) {
      global $wp_query;
      $type = $wp_query->get(\'post_type\') ?: false;
      $template_type = $type ? \'single-\' . $type. \'.php\' : \'single.php\';
      if ( locate_template($template_type) ) {
        return locate_template($template_type);
      } elseif ( $type && locate_template(\'single.php\') ) {
        return locate_template(\'single.php\');
      }
    }
    return $template;
  }
);
您需要对其进行更改,以便处理自定义single-{*}.php 模板优雅(由G.M.编辑)

我可能会晚一点编辑代码,但我想我会让你开始的。

SO网友:cybmeta

我想你可以用template_include() 功能:

 add_filter(\'template_include\',\'alter_template\');
 function alter_template($template){

     global $wp_query;

     if($wp_query->found_posts == 1) {
         $template = get_stylesheet_directory().\'/single.php\';
     }

     return $template;
  }
或者,如果要重定向到帖子,请使用template_direct():

add_action( \'template_redirect\', \'my_page_template_redirect\' );
function my_page_template_redirect()
{
    global $wp_query;
    if($wp_query->found_posts == 1)
    {
        wp_redirect( \'URL_of_the_post );
        exit();
    }
}

结束

相关推荐

如何在wp-Query中比较不同的时间戳以获取事件自定义帖子类型?

我有一个带有自定义元数据库的自定义帖子类型(as seen on wptheming.com) 并且希望进行查询以显示即将发生的事件,例如在侧边栏中,过去的日期被忽略。但我需要一个当前时间的值来和事件开始时间进行比较。现在我从current_time(\'mysql\') 看起来是这样的:2012-02-16 13:15:31元的开始时间如下所示:201108121100如何使这两个日期具有可比性?我可以在查询中执行吗?或者是否有其他解决方案?以下是我到目前为止的查询(值留空,时间戳回显):<?ph

告诉WordPress显示单页而不是档案 - 小码农CODE - 行之有效找到问题解决它

告诉WordPress显示单页而不是档案

时间:2013-09-09 作者:somebody

因此,我在url中有多个自定义参数,当查询达到3个参数时(例如。index.php?post_type=foo&<param-1>=<val-1>&<param-2>=<val-2>&<param-3>=<val-3>) 可以有一个帖子,也可以没有。而不是显示存档(archive-foo.php) 通过这篇文章,我希望wordpress显示文章本身(例如。single-foo.php). 当然我可以在archive-foo.php 并从那里重定向到相应的帖子,但在这种情况下,我“浪费”了显示存档的整个查询。

那么,当归档文件只包含一条记录时,有没有办法通过操纵主查询(使用functions.php 并通过add_action(\'pre_get_posts\', \'<func-name>\'))?

粗略示例:

add_action(\'pre_get_posts\', \'custom_func\')
function custom_func($query) {
    if($query->get(\'param-1\')) {
        // Change some $query params, but still show archive
        if($query->get(\'param-2\')) {
            // Change some $query params, but still show archive
            if($query->get(\'param-3\')) {
                // There is 1 post or none for sure
                // Alter the query to something like
                $wpdb->query(\'SELECT * FROM wp_posts WHERE param1=val1 AND param2=val2 ...\');
                // force to load a single page with the results passed to $post object
            }
        }
    }
}

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

这是一个粗过滤器:

add_filter(
  \'template_include\',
  function($template) {
    global $wp_query;
    if (1 == $wp_query->found_posts) {
      global $wp_query;
      $type = $wp_query->get(\'post_type\') ?: false;
      $template_type = $type ? \'single-\' . $type. \'.php\' : \'single.php\';
      if ( locate_template($template_type) ) {
        return locate_template($template_type);
      } elseif ( $type && locate_template(\'single.php\') ) {
        return locate_template(\'single.php\');
      }
    }
    return $template;
  }
);
您需要对其进行更改,以便处理自定义single-{*}.php 模板优雅(由G.M.编辑)

我可能会晚一点编辑代码,但我想我会让你开始的。

SO网友:cybmeta

我想你可以用template_include() 功能:

 add_filter(\'template_include\',\'alter_template\');
 function alter_template($template){

     global $wp_query;

     if($wp_query->found_posts == 1) {
         $template = get_stylesheet_directory().\'/single.php\';
     }

     return $template;
  }
或者,如果要重定向到帖子,请使用template_direct():

add_action( \'template_redirect\', \'my_page_template_redirect\' );
function my_page_template_redirect()
{
    global $wp_query;
    if($wp_query->found_posts == 1)
    {
        wp_redirect( \'URL_of_the_post );
        exit();
    }
}