PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 15.3.2
Jetpack – WP Security, Backup, Speed, & Growth v15.3.2
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 14.5.1 14.6.1 14.7.1 14.8.1 14.9.2 15.0.3 15.1.2 15.2.1 15.3.2 15.4.1 15.5.1 15.6.1 15.7.2 15.8.1 15.9.2 16.0.2 16.1.3 16.2-a.5 16.2-a.3 16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / _inc / lib / class-jetpack-top-posts-helper.php
jetpack / _inc / lib Last commit date
admin-pages 9 months ago core-api 9 months ago debugger 9 months ago markdown 9 months ago class-jetpack-ai-helper.php 9 months ago class-jetpack-blog-stats-helper.php 9 months ago class-jetpack-currencies.php 2 years ago class-jetpack-instagram-gallery-helper.php 2 years ago class-jetpack-mapbox-helper.php 3 years ago class-jetpack-newsletter-category-helper.php 9 months ago class-jetpack-podcast-feed-locator.php 9 months ago class-jetpack-podcast-helper.php 9 months ago class-jetpack-recommendations.php 9 months ago class-jetpack-top-posts-helper.php 9 months ago class.color.php 2 years ago class.core-rest-api-endpoints.php 9 months ago class.jetpack-automatic-install-skin.php 2 years ago class.jetpack-iframe-embed.php 3 years ago class.jetpack-password-checker.php 9 months ago class.jetpack-search-performance-logger.php 4 years ago class.media-extractor.php 9 months ago class.media-summary.php 9 months ago class.media.php 9 months ago components.php 9 months ago debugger.php 9 months ago icalendar-reader.php 9 months ago markdown.php 9 months ago plans.php 4 years ago plugins.php 4 years ago tonesque.php 9 months ago widgets.php 9 months ago
class-jetpack-top-posts-helper.php
143 lines
1 <?php
2 /**
3 * Top Posts & Pages block helper.
4 *
5 * @package automattic/jetpack
6 */
7
8 use Automattic\Jetpack\Stats\WPCOM_Stats;
9
10 /**
11 * Class Jetpack_Top_Posts_Helper
12 */
13 class Jetpack_Top_Posts_Helper {
14 /**
15 * Returns user's top posts.
16 *
17 * @param int $period Period of days to draw stats from.
18 * @param int $items_count Optional. Number of items to display.
19 * @param string $types Optional. Content types to include.
20 * @return array
21 */
22 public static function get_top_posts( $period, $items_count = null, $types = null ) {
23 $all_time_days = floor( ( time() - strtotime( get_option( 'site_created_date' ) ) ) / ( 60 * 60 * 24 * 365 ) );
24
25 // While we only display ten posts, users can filter out content types.
26 // As such, we should obtain a few spare posts from the Stats endpoint.
27 $posts_to_obtain_count = 30;
28
29 // We should not override cache when displaying the block on the frontend.
30 // But we should allow instant preview of changes when editing the block.
31 $is_rendering_block = ! empty( $types );
32 $override_cache = ! $is_rendering_block;
33
34 $query_args = array(
35 'max' => $posts_to_obtain_count,
36 'summarize' => true,
37 'num' => $period !== 'all-time' ? $period : $all_time_days,
38 'period' => 'day',
39 );
40
41 // Atomic or self-hosted sites via WPCOM public v1.1 endpoint.
42 if ( ! defined( 'IS_WPCOM' ) || ! IS_WPCOM ) {
43 $data = ( new WPCOM_Stats() )->get_top_posts( $query_args, $override_cache );
44 } else {
45 // Directly access posts on WPCOM, as Simple sites run on the same environment.
46 require_lib( 'jetpack-stats' );
47 if ( class_exists( '\Jetpack\Stats\Top_Posts' ) ) {
48 // @phan-suppress-next-line PhanUndeclaredClassMethod
49 $data = ( new \Jetpack\Stats\Top_Posts() )->get_top_posts( get_current_blog_id(), $query_args );
50 } else {
51 $data = array( 'summary' => array( 'postviews' => array() ) );
52 }
53 }
54
55 if ( is_wp_error( $data ) ) {
56 $data = array( 'summary' => array( 'postviews' => array() ) );
57 }
58
59 // Remove posts that have subsequently been deleted.
60 $data['summary']['postviews'] = array_filter(
61 $data['summary']['postviews'],
62 function ( $item ) {
63 return get_post_status( $item['id'] ) === 'publish';
64 }
65 );
66
67 $posts_retrieved = is_countable( $data['summary']['postviews'] ) ? count( $data['summary']['postviews'] ) : 0;
68
69 // Fallback to random posts if user does not have enough top content.
70 if ( $posts_retrieved < $posts_to_obtain_count ) {
71 $args = array(
72 'numberposts' => $posts_to_obtain_count - $posts_retrieved,
73 'exclude' => array_column( $data['summary']['postviews'], 'id' ),
74 'orderby' => 'rand',
75 'post_status' => 'publish',
76 );
77
78 $random_posts = get_posts( $args );
79
80 foreach ( $random_posts as $post ) {
81 $random_posts_data = array(
82 'id' => $post->ID,
83 'href' => get_permalink( $post->ID ),
84 'date' => $post->post_date,
85 'title' => $post->post_title,
86 'type' => 'post',
87 'public' => true,
88 );
89
90 $data['summary']['postviews'][] = $random_posts_data;
91 }
92
93 $data['summary']['postviews'] = array_slice( $data['summary']['postviews'], 0, 10 );
94 }
95
96 $top_posts = array();
97
98 foreach ( $data['summary']['postviews'] as $post ) {
99 $post_id = $post['id'];
100 $thumbnail = get_the_post_thumbnail_url( $post_id );
101
102 if ( ! $thumbnail ) {
103 $post_images = get_attached_media( 'image', $post_id );
104 $post_image = reset( $post_images );
105 if ( $post_image ) {
106 $thumbnail = wp_get_attachment_url( $post_image->ID );
107 }
108 }
109
110 if ( $post['public'] ) {
111 $top_posts[] = array(
112 'id' => $post_id,
113 'author' => get_the_author_meta( 'display_name', get_post_field( 'post_author', $post_id ) ),
114 'context' => get_the_category( $post_id ) ? get_the_category( $post_id ) : get_the_tags( $post_id ),
115 'href' => $post['href'],
116 'date' => get_the_date( '', $post_id ),
117 'title' => $post['title'],
118 'type' => $post['type'],
119 'public' => $post['public'],
120 'views' => isset( $post['views'] ) ? $post['views'] : 0,
121 'thumbnail' => $thumbnail,
122 );
123 }
124 }
125
126 // This applies for rendering the block front-end, but not for editing it.
127 if ( $is_rendering_block ) {
128 $acceptable_types = explode( ',', $types );
129
130 $top_posts = array_filter(
131 $top_posts,
132 function ( $item ) use ( $acceptable_types ) {
133 return in_array( $item['type'], $acceptable_types, true );
134 }
135 );
136
137 $top_posts = array_slice( $top_posts, 0, $items_count );
138 }
139
140 return $top_posts;
141 }
142 }
143