You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

225 lines
6.2 KiB
PHTML

<?php
/**
* The Dashboard Widget of the plugin.
*
* @since 1.0.81
* @package RankMath
* @subpackage RankMath\Core
* @author Rank Math <support@rankmath.com>
*/
namespace RankMath;
use RankMath\KB;
use RankMath\Helper;
use RankMath\Traits\Hooker;
defined( 'ABSPATH' ) || exit;
/**
* Dashboard_Widget class.
*
* @codeCoverageIgnore
*/
class Dashboard_Widget {
use Hooker;
/**
* Constructor.
*/
public function __construct() {
$this->action( 'wp_dashboard_setup', 'add_dashboard_widgets' );
$this->action( 'rank_math/dashboard/widget', 'dashboard_widget_feed', 98 );
$this->action( 'rank_math/dashboard/widget', 'dashboard_widget_footer', 99 );
}
/**
* Register dashboard widget.
*/
public function add_dashboard_widgets() {
// Early Bail if action is not registered for the dashboard widget hook.
if (
( ! Helper::is_module_active( '404-monitor' ) || ! Helper::has_cap( '404_monitor' ) ) &&
( ! Helper::is_module_active( 'redirections' ) || ! Helper::has_cap( 'redirections' ) ) &&
( ! Helper::is_module_active( 'analytics' ) || ! Helper::has_cap( 'analytics' ) )
) {
return;
}
$icon = '<span class="rank-math-icon"><svg viewBox="0 0 462.03 462.03" xmlns="http://www.w3.org/2000/svg" width="20"><g><path d="m462 234.84-76.17 3.43 13.43 21-127 81.18-126-52.93-146.26 60.97 10.14 24.34 136.1-56.71 128.57 54 138.69-88.61 13.43 21z"></path><path d="m54.1 312.78 92.18-38.41 4.49 1.89v-54.58h-96.67zm210.9-223.57v235.05l7.26 3 89.43-57.05v-181zm-105.44 190.79 96.67 40.62v-165.19h-96.67z"></path></g></svg></span>';
wp_add_dashboard_widget(
'rank_math_dashboard_widget',
$icon . esc_html__( 'Rank Math Overview', 'rank-math' ),
[ $this, 'render_dashboard_widget' ],
null,
null,
'normal',
'high'
);
}
/**
* Render dashboard widget.
*/
public function render_dashboard_widget() {
echo '<div id="rank-math-dashboard-widget" class="rank-math-loading"></div>';
}
/**
* Add Feed data in the admin dashboard widget.
*/
public function dashboard_widget_feed() {
$posts = $this->get_feed();
?>
<h3 class="rank-math-blog-title"><?php esc_html_e( 'Latest Blog Posts from Rank Math', 'rank-math' ); ?></h3>
<?php if ( empty( $posts ) ) : ?>
<p><?php esc_html_e( 'Error: the Rank Math blog feed could not be downloaded.', 'rank-math' ); ?></p>
<?php
return;
endif;
echo '<ul class="rank-math-blog-list">';
$posts = $this->filter_posts( $posts );
$label = $this->get_item_label( $posts );
foreach ( $posts as $index => $post ) :
$link = $this->add_utm_params( $post['link'], $index );
?>
<li class="rank-math-blog-post">
<h4>
<?php if ( $label ) : ?>
<span class="rank-math-new-badge"><?php echo esc_html( $label ); ?></span>
<?php endif; ?>
<a target="_blank" href="<?php echo esc_url( $link ); ?>">
<?php echo esc_html( $post['title']['rendered'] ); ?>
</a>
</h4>
</li>
<?php
$label = '';
endforeach;
echo '</ul>';
}
/**
* Get label for first post.
*
* @param array $posts Posts.
*/
private function get_item_label( $posts ) {
$label = '';
if ( ! empty( $posts[0]['custom_label'] ) ) {
$label = $posts[0]['custom_label'];
}
$is_new = time() - strtotime( $posts[0]['date'] ) < 15 * DAY_IN_SECONDS;
if ( $is_new && empty( $label ) ) {
$label = esc_html__( 'NEW', 'rank-math' );
}
return $label;
}
/**
* Filter posts by display condition.
*
* @param array $posts Posts.
*/
private function filter_posts( $posts ) {
$posts = array_filter(
$posts,
function( $post ) {
if ( isset( $post['condition'] ) && 'is_free' === $post['condition'] && defined( 'RANK_MATH_PRO_FILE' ) ) {
return false;
}
return true;
}
);
return array_slice( $posts, 0, 3 ); // Max 3 posts.
}
/**
* Add UTM tags to links. Only add if UTM params are not already present.
*
* @param string $link Link.
* @param int $index Array index.
*/
private function add_utm_params( $link, $index ) {
// Skip if link has any UTM tags already set.
if ( preg_match( '/[?&]utm_[a-z_]+=/', $link ) ) {
return $link;
}
$utm_params = [
'utm_source' => 'Plugin',
'utm_medium' => 'Dashboard%20Widget%20Post%20' . ( $index + 1 ),
'utm_campaign' => 'WP',
];
return add_query_arg( $utm_params, $link );
}
/**
* Add footer in the admin dashboard widget.
*/
public function dashboard_widget_footer() {
?>
<div class="rank-math-widget-footer">
<a target="_blank" href="<?php KB::the( 'blog', 'Dashboard Widget Blog' ); ?>">
<?php esc_html_e( 'Blog', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<a target="_blank" href="<?php KB::the( 'knowledgebase', 'Dashboard Widget Help' ); ?>">
<?php esc_html_e( 'Help', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<?php if ( ! defined( 'RANK_MATH_PRO_FILE' ) ) { ?>
<a target="_blank" href="<?php KB::the( 'pro', 'Dashboard Widget PRO' ); ?>" class="rank-math-widget-go-pro">
<?php esc_html_e( 'Go Pro', 'rank-math' ); ?>
<span class="screen-reader-text"><?php esc_html_e( '(opens in a new window)', 'rank-math' ); ?></span>
<span aria-hidden="true" class="dashicons dashicons-external"></span>
</a>
<?php } ?>
</div>
<?php
}
/**
* Get posts.
*/
private function get_feed() {
$cache_key = 'rank_math_feed_posts_v2';
$cache = get_transient( $cache_key );
if ( false !== $cache ) {
return $cache;
}
$response = wp_remote_get( 'https://rankmath.com/wp-json/wp/v2/posts?dashboard_widget_feed=1' );
if ( is_wp_error( $response ) || 200 !== (int) wp_remote_retrieve_response_code( $response ) ) {
set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS );
return false;
}
$posts = json_decode( wp_remote_retrieve_body( $response ), true );
if ( empty( $posts ) || ! is_array( $posts ) ) {
set_transient( $cache_key, [], 2 * HOUR_IN_SECONDS );
return false;
}
set_transient( $cache_key, $posts, 12 * HOUR_IN_SECONDS );
return $posts;
}
}