如何从档案中隐藏特定的帖子类型?

时间:2017-11-01 作者:Cindy

假设有一个名为profilepost 我想从各种档案中隐藏。(但没有将帖子状态更改为private)我试图获取属于此帖子类型的所有帖子ID。以下代码失败。

global $wpdb;
$profilepost_ids = $wpdb->get_col( "SELECT ID FROM wp_posts where post_type = \'profilepost\'" );
function my_custom_get_posts( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) return;
    if ( $query->is_archive() ) {$query->set( \'post__not_in\', $profilepost_ids );}
}
add_action( \'pre_get_posts\', \'my_custom_get_posts\', 9999 );
但当我更换$query->set( \'post__not_in\', $profilepost_ids ); 具有$query->set( \'post__not_in\', array(1234,4321) );, 如果1234和4321是post ID,则它可以工作。

有人能告诉我我做错了什么吗?

1 个回复
SO网友:Tom J Nowell

pre_get_posts 允许您更改查询要检索的内容,但实际上您所做的是:

抓取A、B、C类型的帖子,然后移除所有带有这些ID的帖子,这些ID恰好是B类型的帖子,这时您的最终结果应该是:

A、C型抓杆,为什么不这样做呢?首先,让我们检索要获取的帖子类型列表:

$post_types = $query->get( \'post_type\' );
那就只需要移除profilepost 从该数组,然后调用set:

$query->set( \'post_type\' $post_types );
因此,概括一下:

抓取新变量中的帖子类型列表,修改新列表,将新列表放回查询中,因为中间步骤是通用PHP,我将不介绍它,而是让您参考此Stack Overflow question.

关于的注释post__not_in

这是一个stupendously 做事慢。避免任何与NOT__not_in 就像瘟疫一样。即使它在单个页面负载上运行很快,也会给您带来严重的扩展问题,并且随着您添加更多内容,速度会呈指数级降低/成本会更高

总是询问你在寻找什么,永远不要问你不想要什么。

关于使用SQL获取所有帖子和查询内容的说明始终使用WP_Query 为了获取帖子,您的SQL查询总是运行,没有缓存来加快速度。此外,查询是不可伸缩的。这是因为它返回的所有内容都没有分页。当表中有5到6篇帖子时,这可能会很好地工作,但当有100或200篇帖子时,您会遇到问题。

记住,posts表包含的不仅仅是posts和页面,菜单项还包括posts、修订、媒体附件,以及大量用于性能和内部原因的隐藏post类型,用户永远看不到这些类型。还要记住,您的数据库服务器和PHP只有这么多的时间和内存来保存内容。

您需要的是可缓存的小东西,您可以请求很多,而不是需要繁重处理的单个大型查询。这就是为什么设置最大限制总是一个好主意的原因,即使你从未期望达到它,它也会设置最坏的情况。

这也是为什么不在查询和随机顺序中很糟糕的原因,因为DB必须扫描整个表来构建一个新的临时表,其中包含所有您不想删除的内容,只有这样它才能运行实际的查询。然后是清理工作。

结束

相关推荐

WooCommerce下载POST-TYPE\\Writepanels限制?

如何更改这些代码,以便设置下载限制,并且没有人可以在添加产品方面更改它们?或者把它们藏起来,让别人看不见?// Download Limit woocommerce_wp_text_input( array( \'id\' => \'_download_limit\', \'label\' => __( \'Download Limit\', \'woocommerce\' ), \'placeholder\' => __(