我想将自定义帖子类型存档用作网站的首页,以便
http://the_site.com/
是根据我的archive-{post-type}.php
文件显示的自定义帖子类型存档。
理想情况下,我想在is_front_page()
文件中使用functions.php
更改查询。我尝试了以下操作,将一个名为“Home”的页面作为我的首页:
add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
global $wp_the_query;
if(is_front_page()&&$wp_the_query===$query){
$query->set('post_type','album');
$query->set('posts_per_page',-1);
}
return $query;
}
但首页返回“Home”的内容,似乎忽略了自定义查询。
我做错了什么?总的来说,还有更好的方法可以解决这个问题吗?
注意:我确实在WordPress Answers发布了此内容,但该社区相对较小。
答案 0 :(得分:8)
将最终解决方案作为答案发布(Isaac将其作为评论),仅供仍在寻找的人使用。
通过functions.php
添加过滤器,Isaac走在正确的轨道上。他做错了是调用is_front_page()
,因为我们在pre_get_posts
并且查询尚未执行,因此无效。
但我们确实拥有当前的页面ID。所以我们仍然可以通过在WordPress选项寄存器中查找名为page_on_front
的选项来解决这个问题,该选项返回用户设置为首页的页面ID。
(有关所有WordPress选项的概述,请访问浏览器中的<yourwordpressinstallation>/wp-admin/options.php
。)
这使得以下解决方案成为as suggested by Ijaas:
add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query) {
// Compare queried page ID to front page ID.
if(!is_admin() && $wp_query->get("page_id") == get_option("page_on_front")) {
// Set custom parameters (values based on Isaacs question).
$wp_query->set("post_type", "album");
$wp_query->set("posts_per_page", -1);
// WP_Query shouldn't actually fetch the page in our case.
$wp_query->set("page_id", "");
}
}
您可能必须更改一些条件标记,以确保所有插件仍然有效,具体取决于查询的更改程度。
希望这有助于某人。
更新:如上所述below,将!is_admin()
添加到if
- 语句,以确保该功能仅在前端运行。如果您只想为初始查询运行此操作,则还可以添加主查询检查$wp_query->is_main_query()
。
答案 1 :(得分:3)
回应Robberts解决方案:
于2013年5月6日12:04回答
将&& !isAdmin()
添加到if函数中,它也会替换所有管理页面的帖子类型查询。
万一有人对此有疑问。
编辑:
同时将&& $wp_query->is_main_query()
添加到if语句会阻止它影响窗口小部件和菜单
所以我有总代码
if($wp_query->get("page_id") == get_option("page_on_front") && !isAdmin() && $wp_query->is_main_query()) {}
答案 2 :(得分:0)
为了使该查询起作用,您必须将该代码添加到页面模板,创建页面,将模板设置为刚刚创建的页面的模板,然后将该页面设置为Settings =&gt;中的主页阅读管理区域。
顺便说一句,is_front_page()
函数只有在您从管理菜单中设置为主页的页面上才返回true。
另一个选项是修改index.php
,但如果你这样做,is_front_page()
将始终返回false。在这种情况下,您需要使用is_home()
代替。
我希望有所帮助。
答案 3 :(得分:0)
Isaac,你是对的,我没有彻底阅读你的问题,我假设你想要以“简单”的方式做到这一点。
无论如何,我把你的代码放在我的测试网站上,实际上它没有用。我查看了我的SQL日志,结果证明您的代码在查询wp_posts.post_status = 'private'
中生成了这个。
所以,我尝试将行$query->set('post_status', 'public');
添加到你的函数中,它运行得很好。
总之,试试这个:
add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
global $wp_the_query;
if(is_front_page()&&$wp_the_query===$query){
$query->set('post_type','album');
$query->set('posts_per_page',-1);
$query->set('post_status', 'public');
}
return $query;
}