Questions tagged «pre-get-posts»

指WordPress核心中的一个钩子,可用于更改基于WP_Query的数据库查询返回的结果。

5
何时使用WP_query(),query_posts()和pre_get_posts
我读了@nacin的《 你昨天不知道查询》,并被发送了一个查询兔子洞。昨天之前,我(错误地)使用query_posts()了所有查询需求。现在,我对使用会更明智WP_Query(),但是仍然有一些灰色区域。 我想我肯定知道的是: 如果我要在页面上的任何地方(在侧边栏中,在页脚中,任何类型的“相关文章”等)进行附加循环,我想使用WP_Query()。我可以在单个页面上重复使用它而不会造成任何伤害。(对?)。 我不确定的是 什么时候使用@ nacin的 pre_get_posts对比WP_Query()?我pre_get_posts现在应该用所有东西吗? 当我想修改模板页面中的循环时(假设我要修改分类档案页面),是否要删除if have_posts : while have_posts : the_post零件并编写自己的零件WP_Query()?还是pre_get_posts在我的functions.php文件中使用修改输出? tl; dr 我想从中得出的tl; dr规则是: 切勿使用query_posts了 在单个页面上运行多个查询时,请使用 WP_Query() 修改循环时,请执行____。 谢谢你的智慧 特里 ps:我已经看过并读过:什么时候应该使用WP_Query vs query_posts()vs get_posts()?这增加了另一个维度- get_posts。但根本不处理pre_get_posts。

12
按元值排序,但包含没有一个的帖子
我一直在使用pre_get_posts过滤器修改内置的WP搜索,使用户可以按不同字段对帖子(包括一堆自定义帖子类型)进行排序。 我遇到的问题是,当我告诉WP按元值排序时,它将排除所有未设置该元值的帖子。如果将排序方式从“价格”更改为“日期”,这将导致结果数量发生变化,因为“帖子”没有设置“价格”,而“项目”却设置了。 这不是我想要的,所以我想知道是否有一种方法可以包含所有帖子-即使那些缺少我正在排序的元值的帖子-并将没有该值的帖子放在最后。 我知道如何在多个字段上进行排序,但这无济于事。 谢谢 似乎我不是唯一一个提出此问题的人:如何在wp_query的args中包含带有&不带有某些meta_key的帖子?但那里没有解决方案。 更新资料 我已经尝试了答案,但是不确定我是否理解正确,这是我现在所拥有的: <?php function my_stuff ($qry) { $qry->set('meta_query', array(array( 'key' => 'item_price', 'value' => '', 'compare' => 'NOT EXISTS' ))); $qry->set('orderby', 'meta_value date'); # Sorting works with meta_value as well as meta_value_num - I've tried both $qry->set('order', 'ASC DESC'); $qry->set('meta_key', 'item_price'); } 元值是一个数字(顾名思义,它用于存储价格) 更新2 …

3
我应该使用Pre Get Posts还是WP_Query
我有以下查询,我通过以下方式在我的taxonomy.php模板中调用 query_brands_geo('dealers', 'publish', '1', $taxtype, $geo, $brands); 此功能运行完美。但是,在阅读了用于查询帖子的Codex之后,它提到了pre_get_posts作为更改默认查询的首选方法。pre_get_posts比下面的wp_query函数更有效吗? 如果是这样,我将如何构造pre_get_posts并在下面传递变量和查询? function my_custom_query($posttype, $poststatus, $paidvalue, $taxtype, $geo, $brands) { global $wp_query; $wp_query = new WP_Query(); $args = array( 'post_type' => $posttype, 'post_status' => array($poststatus), 'orderby' => 'rand', 'posts_per_page' => 30, 'meta_query' => array( array( 'key' => 'wpcf-paid', 'value' => array($paidvalue), 'compare' => …

3
我可以使用pre_get_posts函数通过元键排除帖子吗?
我看到许多人更喜欢使用pre_get_posts钩子代替query_posts。下面的代码可以正常工作,并显示所有具有“功能”元键的帖子 function show_featured_posts ( $query ) { if ( $query->is_main_query() ) { $query->set( 'meta_key', 'featured' ); $query->set( 'meta_value', 'yes' ); } } add_action( 'pre_get_posts', 'show_featured_posts' ); 但是我希望将具有' featured'meta_key 的帖子从主要查询中排除。有一个简单的方法吗?

2
在WP_Query中使用pre_get_posts
我读斯蒂芬·哈里斯的出色回答这个问题,关于使用WP_query(),query_posts()和pre_get_posts。 他说:“ pre_get_posts是一个过滤器,用于更改任何查询。它最常用于仅更改“主查询”。 可以仅pre_get_posts过滤使用?创建的特定辅助查询。例如。WP_Query $my_secondary_loop = new WP_Query(...); if( $my_secondary_loop->have_posts() ): while( $my_secondary_loop->have_posts() ): $my_secondary_loop->the_post(); //The secondary loop endwhile; endif; wp_reset_postdata(); 任何帮助,不胜感激。

3
即时贴超过每页限制
我正在pre_get_posts调整首页上显示的帖子数。 function lifelounge_query_adjust( $query ) { if ( is_home() ) { set_query_var( 'posts_per_page', 12 ); return; } } add_filter( 'pre_get_posts', 'lifelounge_query_adjust' ); 但是我遇到了粘性帖子的问题。基本上,如果我有任何置顶文章,查询会显示更多比我所指定的12个职位,因为它会显示12篇加任何置顶文章。我当然可以忽略粘性帖子: function lifelounge_query_adjust( $query ) { if ( is_home() ) { set_query_var( 'posts_per_page', 1 ); set_query_var( 'ignore_sticky_posts', 1 ); return; } } add_filter( 'pre_get_posts', 'lifelounge_query_adjust' ); 但是我不认为这是理想的。我认为粘性帖子应包含在12个帖子的限制中,而不应添加到该限制中。那对我来说最有意义。有办法实现吗?我是否犯了一个值得脸彩的错误? 几乎重复:粘性帖子和每页的帖子,但是由于本地化太过奇怪而被关闭。我不同意,显然是因为我在寻找答案,也因为这是一个问题,为什么如果您使用粘性帖子,WordPress似乎不尊重该posts_per_page …

1
在真实页面和静态首页上使用pre_get_posts
我已经对如何pre_get_posts在真实的页面和静态的首页上使用进行了广泛的研究,而且似乎没有万无一失的方法。 到目前为止,我发现最好的选择是@birgire在Stackoverflow上发表的一篇文章。我已经将其重写为演示类,并使代码更具动态性 class PreGeTPostsForPages { /** * @var string|int $pageID * @access protected * @since 1.0.0 */ protected $pageID; /** * @var bool $injectPageIntoLoop * @access protected * @since 1.0.0 */ protected $injectPageIntoLoop; /** * @var array $args * @access protected * @since 1.0.0 */ protected $args; /** * @var …

4
修改分类法页面以排除子分类法中的项目
我发现了这个问题: 有没有一种方法可以在pre_get_posts过滤器中使用$ query-> set('tax_query'? 这似乎表明是的,您可以通过pre_get_posts()更改分类档案中的分类查询。所以我想出了 add_action('pre_get_posts', 'kia_no_child_terms' ); function kia_no_child_terms( $wp_query ) { if( is_tax() ) { $wp_query->tax_query->queries[0]['include_children'] = 0; } } 以及 add_action('pre_get_posts', 'kia_no_child_terms' ); function kia_no_child_terms( $wp_query ) { if( is_tax() ) { $tax_query = $wp_query->get( 'tax_query' ); $tax_query->queries[0]['include_children'] = 0; $wp_query->set( 'tax_query', $tax_query ); } } 尝试将include_children参数设置为false …

2
有没有一种方法可以在pre_get_posts过滤器中使用$ query-> set('tax_query'?
有没有办法$query->set('tax_query', ...)在pre_get_posts过滤器中使用?例如,下一个代码不会更改查询。请注意,我正在通过和自定义搜索构建$分类法。 function custom_search_filter($query) { ... // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN') $taxonomies = implode(',', $taxonomy_arr); // /wordpress/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies $taxonomy_query = array('relation' => 'AND', $taxonomies); $query->set('tax_query', $taxonomy_query); } return $query; } add_filter( 'pre_get_posts', 'custom_search_filter', 999 ); 提前致谢。

2
媒体库仅列出用户上传的图像
我只想列出用户上传的图像。这是场景: 使用iframe在前端使用图片上传器。 我upload_files为用户级别的用户添加了上限,希望他们只能看到他们上传的图像。 我已经找到此问题Q 限制用户仅查看他们已上传的媒体库项目吗?但是接受的答案对我不起作用。 // Code originally by @t31os add_action('pre_get_posts','users_own_attachments'); function users_own_attachments( $wp_query_obj ) { global $current_user, $pagenow; if( !is_a( $current_user, 'WP_User') ) return; if( 'upload.php' != $pagenow ) return; if( !current_user_can('delete_pages') ) $wp_query_obj->set('author', $current_user->id ); return; } 我正在使用图像上传器的前端页面名为“条目”。 如果我删除了代码if( 'upload.php' != $pagenow ) return;的这一部分,则代码有效。我想我必须改进条件代码的这一部分,但无法弄清楚。有条件的很重要,因为我不希望代码在不需要的其他页面上应用。 因此,我需要帮助来改善我提到的条件部分。谢谢!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.