class-yoast-dashboard-widget.php
4.46 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<?php
/**
* @package WPSEO\Admin
*/
/**
* Class to change or add WordPress dashboard widgets
*/
class Yoast_Dashboard_Widget {
const CACHE_TRANSIENT_KEY = 'wpseo-dashboard-totals';
/**
* @var WPSEO_Statistics
*/
protected $statistics;
/**
* @param WPSEO_Statistics $statistics The statistics class to retrieve statistics from.
*/
public function __construct( WPSEO_Statistics $statistics = null ) {
if ( null === $statistics ) {
$statistics = new WPSEO_Statistics();
}
$this->statistics = $statistics;
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_dashboard_stylesheet' ) );
add_action( 'wp_dashboard_setup', array( $this, 'add_dashboard_widget' ) );
add_action( 'wp_insert_post', array( $this, 'clear_cache' ) );
add_action( 'delete_post', array( $this, 'clear_cache' ) );
}
/**
* Adds dashboard widget to WordPress
*/
public function add_dashboard_widget() {
wp_add_dashboard_widget(
'wpseo-dashboard-overview',
/* translators: %s is the plugin name */
sprintf( __( '%s Posts Overview', 'wordpress-seo' ), 'Yoast SEO' ),
array( $this, 'display_dashboard_widget' )
);
}
/**
* Display the dashboard widget
*/
public function display_dashboard_widget() {
$statistics = $this->statistic_items();
include WPSEO_PATH . '/admin/views/dashboard-widget.php';
}
/**
* Enqueue's stylesheet for the dashboard if the current page is the dashboard
*/
public function enqueue_dashboard_stylesheet() {
if ( 'dashboard' === get_current_screen()->id ) {
wp_enqueue_style( 'wpseo-wp-dashboard', plugins_url( 'css/dashboard' . WPSEO_CSSJS_SUFFIX . '.css', WPSEO_FILE ), array(), WPSEO_VERSION );
}
}
/**
* Clears the dashboard widget items cache
*/
public function clear_cache() {
delete_transient( self::CACHE_TRANSIENT_KEY );
}
/**
* An array representing items to be added to the At a Glance dashboard widget
*
* @return array
*/
private function statistic_items() {
$transient = get_transient( self::CACHE_TRANSIENT_KEY );
$user_id = get_current_user_id();
if ( isset( $transient[ $user_id ][1] ) ) {
return $transient[ $user_id ];
}
return $this->set_statistic_items_for_this_user( $transient );
}
/**
* Set the cache for a specific user
*
* @param array|boolean $transient The current stored transient with the cached data.
*
* @return mixed
*/
private function set_statistic_items_for_this_user( $transient ) {
if ( $transient === false ) {
$transient = array();
}
$user_id = get_current_user_id();
$filtered_items[ $user_id ] = array_filter( $this->get_seo_scores_with_post_count(), array( $this, 'filter_items' ) );
set_transient( self::CACHE_TRANSIENT_KEY, array_merge( $filtered_items, $transient ), DAY_IN_SECONDS );
return $filtered_items[ $user_id ];
}
/**
* Set the SEO scores belonging to their SEO score result
*
* @return array
*/
private function get_seo_scores_with_post_count() {
return array(
array(
'seo_rank' => 'good',
'title' => __( 'Posts with good SEO score', 'wordpress-seo' ),
'class' => 'wpseo-glance-good',
'count' => $this->statistics->get_good_seo_post_count(),
),
array(
'seo_rank' => 'ok',
'title' => __( 'Posts with OK SEO score', 'wordpress-seo' ),
'class' => 'wpseo-glance-ok',
'count' => $this->statistics->get_ok_seo_post_count(),
),
array(
'seo_rank' => 'poor',
'title' => __( 'Posts with poor SEO score', 'wordpress-seo' ),
'class' => 'wpseo-glance-poor',
'count' => $this->statistics->get_poor_seo_post_count(),
),
array(
'seo_rank' => 'bad',
'title' => __( 'Posts with bad SEO score', 'wordpress-seo' ),
'class' => 'wpseo-glance-bad',
'count' => $this->statistics->get_bad_seo_post_count(),
),
array(
'seo_rank' => 'na',
'title' => __( 'Posts without focus keyword', 'wordpress-seo' ),
'class' => 'wpseo-glance-na',
'count' => $this->statistics->get_no_focus_post_count(),
),
array(
'seo_rank' => 'noindex',
/* translators: %s expands to <code>noindex</code> */
'title' => sprintf( __( 'Posts that are set to %s', 'wordpress-seo' ), '<code>noindex</code>' ),
'class' => 'wpseo-glance-noindex',
'count' => $this->statistics->get_no_index_post_count(),
),
);
}
/**
* Filter items if they have a count of zero
*
* @param array $item
*
* @return bool
*/
private function filter_items( $item ) {
return 0 !== $item['count'];
}
}