Files
SIGE-WEB-snapshot/wp-content/plugins/jetpack/modules/masterbar/wp-posts-list/class-posts-list-page-notification.php

145 lines
4.0 KiB
PHP

<?php
/**
* Posts_List_Page_Notification file.
* Disable edit_post and delete_post capabilities for Posts Pages in WP-Admin and display a notification icon.
*
* @package Jetpack
*/
namespace Automattic\Jetpack\Dashboard_Customizations;
/**
* Class Posts_List_Page_Notification
*
* @package Automattic\Jetpack\Dashboard_Customizations
*/
class Posts_List_Page_Notification {
/**
* Site's Posts page id
*
* @var int|null
*/
private $posts_page_id;
/**
* If the Post_list contains the site's Posts Page
*
* @var bool
*/
private $is_page_in_list = false;
/**
* Class instance.
*
* @var Posts_List_Page_Notification|null
*/
private static $instance = null;
/**
* Posts_List_Page_Notification constructor.
*
* @param string $posts_page_id The Posts page configured in WordPress.
* @param string $show_on_front The show_on_front site option.
* @param string $page_on_front The page_on_front site_option.
*/
public function __construct( $posts_page_id, $show_on_front, $page_on_front ) {
if ( 'page' === $show_on_front && $posts_page_id !== $page_on_front ) {
add_action( 'init', array( $this, 'init_actions' ) );
}
$this->posts_page_id = '' === $posts_page_id ? null : (int) $posts_page_id;
}
/**
* Add in all hooks.
*/
public function init_actions() {
\add_filter( 'map_meta_cap', array( $this, 'disable_posts_page' ), 10, 4 );
\add_filter( 'post_class', array( $this, 'add_posts_page_css_class' ), 10, 3 );
\add_action( 'admin_print_footer_scripts-edit.php', array( $this, 'add_notification_icon' ) );
\add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_css' ) );
}
/**
* Creates instance.
*
* @return Posts_List_Page_Notification
*/
public static function init() {
if ( self::$instance === null ) {
self::$instance = new self( \get_option( 'page_for_posts' ), \get_option( 'show_on_front' ), \get_option( 'page_on_front' ) );
}
return self::$instance;
}
/**
* Disable editing and deleting for the page that is configured as a Posts Page.
*
* @param array $caps Array of capabilities.
* @param string $cap The current capability.
* @param string $user_id The user id.
* @param array $args Argument array.
* @return array
*/
public function disable_posts_page( $caps, $cap, $user_id, $args ) {
if ( 'edit_post' !== $cap && 'delete_post' !== $cap ) {
return $caps;
}
if ( isset( $args[0] ) && $this->posts_page_id === $args[0] ) {
$caps[] = 'do_not_allow';
}
return $caps;
}
/**
* Load the CSS for the WP Posts List
*
* We would probably need to move this elsewhere when new features are introduced to wp-posts-list.
*/
public function enqueue_css() {
\wp_enqueue_style( 'wp-posts-list', plugins_url( 'wp-posts-list.css', __FILE__ ), array(), JETPACK__VERSION );
}
/**
* Adds a CSS class on the page configured as a Posts Page.
*
* @param array $classes A list of CSS classes.
* @param string $class A CSS class.
* @param string $post_id The current post id.
* @return array
*/
public function add_posts_page_css_class( $classes, $class, $post_id ) {
if ( $this->posts_page_id !== $post_id ) {
return $classes;
}
$this->is_page_in_list = true;
$classes[] = 'posts-page';
return $classes;
}
/**
* Add a info icon on the Posts Page letting the user know why they cannot delete and remove the page.
*/
public function add_notification_icon() {
// No need to add the JS since the site is not configured with a Posts Page or the current listview doesn't contain the page.
if ( null === $this->posts_page_id || ! $this->is_page_in_list ) {
return;
}
$text_notice = __( 'The content of your latest posts page is automatically generated and cannot be edited.', 'jetpack' );
?>
<script>
document.querySelector(".posts-page .check-column").innerHTML = '' +
'<div class="info"><span class="icon dashicons dashicons-info-outline"></span><span class="message"><?php echo esc_html( $text_notice ); ?></span></div>';
</script>
<?php
}
}