当面临同样的要求时,我选择使用直接MySQL调用来计算当前帖子所在的页面,而不必检索和循环此post\\u类型中的每个帖子。我之所以选择这条路线,是因为我发现在一个有数千篇帖子的网站上工作要快得多。
这种方法也可以放在函数/方法中,从任何地方确定。
function which_page_is_this_post_on( \\WP_Post $post ) : int {
global $wpdb;
return $wpdb->get_var( $wpdb->prepare( "SELECT CEIL(COUNT(*) / %d) from {$wpdb->posts} WHERE `ID` <= %d and post_type=%s and post_status=\'publish\'", get_option( \'posts_per_page\' ), $post->ID, $post->post_type ) );
}
如果发现经常调用它(如在模板中),可以根据需要将结果存储在对象缓存中。
function which_page_is_this_post_on( \\WP_Post $post ) : int {
global $wpdb;
$cached = wp_cache_get( __FUNCTION__ . $post->ID );
if ( ! $cached ) {
$cached = $wpdb->get_var( $wpdb->prepare( "SELECT CEIL(COUNT(*) / %d) from {$wpdb->posts} WHERE `ID` <= %d and post_type=%s and post_status=\'publish\'", get_option( \'posts_per_page\' ), $post->ID, $post->post_type ) );
wp_cache_set( __FUNCTION__ . $post->ID, $cached, 15 * MINUTE_IN_SECONDS );
}
return $cached;
}