2017-06-13 09:45:37 +02:00
< ? php
/**
2018-12-04 14:01:14 +01:00
* WPSEO plugin file .
*
2017-06-13 09:45:37 +02:00
* @ package WPSEO\Admin
*/
/**
* Class that holds most of the admin functionality for Yoast SEO .
*/
class WPSEO_Admin {
/** The page identifier used in WordPress to register the admin page !DO NOT CHANGE THIS! */
const PAGE_IDENTIFIER = 'wpseo_dashboard' ;
/**
2017-11-15 16:23:10 +01:00
* Array of classes that add admin functionality .
2017-06-13 09:45:37 +02:00
*
* @ var array
*/
protected $admin_features ;
/**
2017-11-15 16:23:10 +01:00
* Class constructor .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
public function __construct () {
$integrations = array ();
2017-06-13 09:45:37 +02:00
global $pagenow ;
2017-11-15 16:23:10 +01:00
$wpseo_menu = new WPSEO_Menu ();
$wpseo_menu -> register_hooks ();
2017-06-13 09:45:37 +02:00
if ( is_multisite () ) {
WPSEO_Options :: maybe_set_multisite_defaults ( false );
}
2018-12-04 14:01:14 +01:00
if ( WPSEO_Options :: get ( 'stripcategorybase' ) === true ) {
2017-06-13 09:45:37 +02:00
add_action ( 'created_category' , array ( $this , 'schedule_rewrite_flush' ) );
add_action ( 'edited_category' , array ( $this , 'schedule_rewrite_flush' ) );
add_action ( 'delete_category' , array ( $this , 'schedule_rewrite_flush' ) );
}
2018-12-04 14:01:14 +01:00
if ( WPSEO_Options :: get ( 'disable-attachment' ) === true ) {
add_filter ( 'wpseo_accessible_post_types' , array ( 'WPSEO_Post_Type' , 'filter_attachment_post_type' ) );
}
2017-06-13 09:45:37 +02:00
$this -> admin_features = array (
// Google Search Console.
'google_search_console' => new WPSEO_GSC (),
'dashboard_widget' => new Yoast_Dashboard_Widget (),
);
if ( WPSEO_Metabox :: is_post_overview ( $pagenow ) || WPSEO_Metabox :: is_post_edit ( $pagenow ) ) {
$this -> admin_features [ 'primary_category' ] = new WPSEO_Primary_Term_Admin ();
}
if ( filter_input ( INPUT_GET , 'page' ) === 'wpseo_tools' && filter_input ( INPUT_GET , 'tool' ) === null ) {
new WPSEO_Recalculate_Scores ();
}
add_filter ( 'plugin_action_links_' . WPSEO_BASENAME , array ( $this , 'add_action_link' ), 10 , 2 );
add_action ( 'admin_enqueue_scripts' , array ( $this , 'config_page_scripts' ) );
add_action ( 'admin_enqueue_scripts' , array ( $this , 'enqueue_global_style' ) );
add_filter ( 'user_contactmethods' , array ( $this , 'update_contactmethods' ), 10 , 1 );
add_action ( 'after_switch_theme' , array ( $this , 'switch_theme' ) );
add_action ( 'switch_theme' , array ( $this , 'switch_theme' ) );
add_filter ( 'set-screen-option' , array ( $this , 'save_bulk_edit_options' ), 10 , 3 );
add_action ( 'admin_init' , array ( 'WPSEO_Plugin_Conflict' , 'hook_check_for_plugin_conflicts' ), 10 , 1 );
2017-11-15 16:23:10 +01:00
add_action ( 'admin_init' , array ( $this , 'map_manage_options_cap' ) );
2017-06-13 09:45:37 +02:00
WPSEO_Sitemaps_Cache :: register_clear_on_option_update ( 'wpseo' );
2018-12-04 14:01:14 +01:00
WPSEO_Sitemaps_Cache :: register_clear_on_option_update ( 'home' );
2017-06-13 09:45:37 +02:00
if ( WPSEO_Utils :: is_yoast_seo_page () ) {
add_action ( 'admin_enqueue_scripts' , array ( $this , 'enqueue_assets' ) );
}
if ( WPSEO_Utils :: is_api_available () ) {
2017-11-15 16:23:10 +01:00
$configuration = new WPSEO_Configuration_Page ();
$configuration -> set_hooks ();
2017-06-13 09:45:37 +02:00
$configuration -> catch_configuration_request ();
}
$this -> set_upsell_notice ();
2017-11-15 16:23:10 +01:00
$this -> initialize_cornerstone_content ();
2018-12-04 14:01:14 +01:00
if ( WPSEO_Utils :: is_plugin_network_active () ) {
$integrations [] = new Yoast_Network_Admin ();
}
2017-11-15 16:23:10 +01:00
$integrations [] = new WPSEO_Yoast_Columns ();
$integrations [] = new WPSEO_License_Page_Manager ();
$integrations [] = new WPSEO_Statistic_Integration ();
$integrations [] = new WPSEO_Capability_Manager_Integration ( WPSEO_Capability_Manager_Factory :: get () );
2018-12-04 14:01:14 +01:00
$integrations [] = new WPSEO_Admin_Media_Purge_Notification ();
$integrations [] = new WPSEO_Admin_Gutenberg_Compatibility_Notification ();
$integrations [] = new WPSEO_Expose_Shortlinks ();
2017-11-15 16:23:10 +01:00
$integrations = array_merge ( $integrations , $this -> initialize_seo_links () );
/** @var WPSEO_WordPress_Integration $integration */
foreach ( $integrations as $integration ) {
$integration -> register_hooks ();
}
2017-06-13 09:45:37 +02:00
}
/**
2017-11-15 16:23:10 +01:00
* Schedules a rewrite flush to happen at shutdown .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
public function schedule_rewrite_flush () {
2017-06-13 09:45:37 +02:00
add_action ( 'shutdown' , 'flush_rewrite_rules' );
}
/**
2017-11-15 16:23:10 +01:00
* Returns all the classes for the admin features .
2017-06-13 09:45:37 +02:00
*
* @ return array
*/
public function get_admin_features () {
return $this -> admin_features ;
}
/**
2017-11-15 16:23:10 +01:00
* Register assets needed on admin pages .
2017-06-13 09:45:37 +02:00
*/
public function enqueue_assets () {
if ( 'wpseo_licenses' === filter_input ( INPUT_GET , 'page' ) ) {
2017-11-15 16:23:10 +01:00
$asset_manager = new WPSEO_Admin_Asset_Manager ();
2017-06-13 09:45:37 +02:00
$asset_manager -> enqueue_style ( 'extensions' );
}
}
/**
2017-11-15 16:23:10 +01:00
* Returns the manage_options capability .
2017-06-13 09:45:37 +02:00
*
2017-11-15 16:23:10 +01:00
* @ return string The capability to use .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
public function get_manage_options_cap () {
2017-06-13 09:45:37 +02:00
/**
2017-11-15 16:23:10 +01:00
* Filter : 'wpseo_manage_options_capability' - Allow changing the capability users need to view the settings pages .
2017-06-13 09:45:37 +02:00
*
2017-11-15 16:23:10 +01:00
* @ api string unsigned The capability .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
return apply_filters ( 'wpseo_manage_options_capability' , 'wpseo_manage_options' );
}
2017-06-13 09:45:37 +02:00
2017-11-15 16:23:10 +01:00
/**
* Maps the manage_options cap on saving an options page to wpseo_manage_options .
*/
public function map_manage_options_cap () {
$option_page = ! empty ( $_POST [ 'option_page' ] ) ? $_POST [ 'option_page' ] : '' ; // WPCS: CSRF ok.
if ( strpos ( $option_page , 'yoast_wpseo' ) === 0 ) {
add_filter ( 'option_page_capability_' . $option_page , array ( $this , 'get_manage_options_cap' ) );
}
2017-06-13 09:45:37 +02:00
}
/**
* Adds the ability to choose how many posts are displayed per page
* on the bulk edit pages .
*/
2017-11-15 16:23:10 +01:00
public function bulk_edit_options () {
2017-06-13 09:45:37 +02:00
$option = 'per_page' ;
$args = array (
'label' => __ ( 'Posts' , 'wordpress-seo' ),
'default' => 10 ,
'option' => 'wpseo_posts_per_page' ,
);
add_screen_option ( $option , $args );
}
/**
* Saves the posts per page limit for bulk edit pages .
*
* @ param int $status Status value to pass through .
* @ param string $option Option name .
* @ param int $value Count value to check .
*
* @ return int
*/
2017-11-15 16:23:10 +01:00
public function save_bulk_edit_options ( $status , $option , $value ) {
2017-06-13 09:45:37 +02:00
if ( 'wpseo_posts_per_page' === $option && ( $value > 0 && $value < 1000 ) ) {
return $value ;
}
return $status ;
}
/**
2018-12-04 14:01:14 +01:00
* Adds links to Premium Support and FAQ under the plugin in the plugin overview page .
2017-06-13 09:45:37 +02:00
*
2017-11-15 16:23:10 +01:00
* @ staticvar string $this_plugin Holds the directory & filename for the plugin .
2017-06-13 09:45:37 +02:00
*
2017-11-15 16:23:10 +01:00
* @ param array $links Array of links for the plugins , adapted when the current plugin is found .
* @ param string $file The filename for the current plugin , which the filter loops through .
2017-06-13 09:45:37 +02:00
*
* @ return array $links
*/
2017-11-15 16:23:10 +01:00
public function add_action_link ( $links , $file ) {
if ( WPSEO_BASENAME === $file && WPSEO_Capability_Utils :: current_user_can ( 'wpseo_manage_options' ) ) {
2017-06-13 09:45:37 +02:00
$settings_link = '<a href="' . esc_url ( admin_url ( 'admin.php?page=' . self :: PAGE_IDENTIFIER ) ) . '">' . __ ( 'Settings' , 'wordpress-seo' ) . '</a>' ;
array_unshift ( $links , $settings_link );
}
if ( class_exists ( 'WPSEO_Product_Premium' ) ) {
2018-12-04 14:01:14 +01:00
$product_premium = new WPSEO_Product_Premium ();
$extension_manager = new WPSEO_Extension_Manager ();
if ( $extension_manager -> is_activated ( $product_premium -> get_slug () ) ) {
2017-06-13 09:45:37 +02:00
return $links ;
}
}
// Add link to premium support landing page.
2018-12-04 14:01:14 +01:00
$premium_link = '<a style="font-weight: bold;" href="' . esc_url ( WPSEO_Shortlinker :: get ( 'https://yoa.st/1yb' ) ) . '" target="_blank">' . __ ( 'Premium Support' , 'wordpress-seo' ) . '</a>' ;
2017-06-13 09:45:37 +02:00
array_unshift ( $links , $premium_link );
// Add link to docs.
2018-12-04 14:01:14 +01:00
$faq_link = '<a href="' . esc_url ( WPSEO_Shortlinker :: get ( 'https://yoa.st/1yc' ) ) . '" target="_blank">' . __ ( 'FAQ' , 'wordpress-seo' ) . '</a>' ;
2017-06-13 09:45:37 +02:00
array_unshift ( $links , $faq_link );
return $links ;
}
/**
* Enqueues the ( tiny ) global JS needed for the plugin .
*/
2017-11-15 16:23:10 +01:00
public function config_page_scripts () {
$asset_manager = new WPSEO_Admin_Asset_Manager ();
$asset_manager -> enqueue_script ( 'admin-global-script' );
2017-06-13 09:45:37 +02:00
2017-11-15 16:23:10 +01:00
wp_localize_script ( WPSEO_Admin_Asset_Manager :: PREFIX . 'admin-global-script' , 'wpseoAdminGlobalL10n' , $this -> localize_admin_global_script () );
2017-06-13 09:45:37 +02:00
}
/**
* Enqueues the ( tiny ) global stylesheet needed for the plugin .
*/
public function enqueue_global_style () {
$asset_manager = new WPSEO_Admin_Asset_Manager ();
$asset_manager -> enqueue_style ( 'admin-global' );
}
/**
* Filter the $contactmethods array and add Facebook , Google + and Twitter .
*
* These are used with the Facebook author , rel = " author " and Twitter cards implementation .
*
2017-11-15 16:23:10 +01:00
* @ param array $contactmethods Currently set contactmethods .
2017-06-13 09:45:37 +02:00
*
* @ return array $contactmethods with added contactmethods .
*/
public function update_contactmethods ( $contactmethods ) {
// Add Google+.
$contactmethods [ 'googleplus' ] = __ ( 'Google+' , 'wordpress-seo' );
// Add Twitter.
$contactmethods [ 'twitter' ] = __ ( 'Twitter username (without @)' , 'wordpress-seo' );
// Add Facebook.
$contactmethods [ 'facebook' ] = __ ( 'Facebook profile URL' , 'wordpress-seo' );
return $contactmethods ;
}
/**
2017-11-15 16:23:10 +01:00
* Log the updated timestamp for user profiles when theme is changed .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
public function switch_theme () {
2017-06-13 09:45:37 +02:00
$users = get_users ( array ( 'who' => 'authors' ) );
if ( is_array ( $users ) && $users !== array () ) {
foreach ( $users as $user ) {
update_user_meta ( $user -> ID , '_yoast_wpseo_profile_updated' , time () );
}
}
}
/**
* Localization for the dismiss urls .
*
* @ return array
*/
private function localize_admin_global_script () {
return array (
2018-12-04 14:01:14 +01:00
/* translators: %s: '%%term_title%%' variable used in titles and meta's template that's not compatible with the given template */
'variable_warning' => sprintf ( __ ( 'Warning: the variable %s cannot be used in this template. See the help center for more info.' , 'wordpress-seo' ), '<code>%s</code>' ),
2017-06-13 09:45:37 +02:00
'dismiss_about_url' => $this -> get_dismiss_url ( 'wpseo-dismiss-about' ),
'dismiss_tagline_url' => $this -> get_dismiss_url ( 'wpseo-dismiss-tagline-notice' ),
'help_video_iframe_title' => __ ( 'Yoast SEO video tutorial' , 'wordpress-seo' ),
2017-11-15 16:23:10 +01:00
'scrollable_table_hint' => __ ( 'Scroll to see the table content.' , 'wordpress-seo' ),
2017-06-13 09:45:37 +02:00
);
}
/**
* Extending the current page URL with two params to be able to ignore the notice .
*
* @ param string $dismiss_param The param used to dismiss the notification .
*
* @ return string
*/
private function get_dismiss_url ( $dismiss_param ) {
$arr_params = array (
$dismiss_param => '1' ,
'nonce' => wp_create_nonce ( $dismiss_param ),
);
return esc_url ( add_query_arg ( $arr_params ) );
}
/**
2017-11-15 16:23:10 +01:00
* Sets the upsell notice .
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
protected function set_upsell_notice () {
$upsell = new WPSEO_Product_Upsell_Notice ();
$upsell -> dismiss_notice_listener ();
$upsell -> initialize ();
}
/**
* Whether we are on the admin dashboard page .
*
* @ returns bool
*/
protected function on_dashboard_page () {
return 'index.php' === $GLOBALS [ 'pagenow' ];
}
2017-06-13 09:45:37 +02:00
2017-11-15 16:23:10 +01:00
/**
* Loads the cornerstone filter .
*/
protected function initialize_cornerstone_content () {
2018-12-04 14:01:14 +01:00
if ( ! WPSEO_Options :: get ( 'enable_cornerstone_content' ) ) {
2017-11-15 16:23:10 +01:00
return ;
}
$cornerstone_filter = new WPSEO_Cornerstone_Filter ();
$cornerstone_filter -> register_hooks ();
2017-06-13 09:45:37 +02:00
}
/**
2017-11-15 16:23:10 +01:00
* Initializes the seo link watcher .
*
* @ returns WPSEO_WordPress_Integration []
2017-06-13 09:45:37 +02:00
*/
2017-11-15 16:23:10 +01:00
protected function initialize_seo_links () {
$integrations = array ();
$link_table_compatibility_notifier = new WPSEO_Link_Compatibility_Notifier ();
$link_table_accessible_notifier = new WPSEO_Link_Table_Accessible_Notifier ();
2018-12-04 14:01:14 +01:00
if ( ! WPSEO_Options :: get ( 'enable_text_link_counter' ) ) {
2017-11-15 16:23:10 +01:00
$link_table_compatibility_notifier -> remove_notification ();
return $integrations ;
}
$integrations [] = new WPSEO_Link_Cleanup_Transient ();
// Only use the link module for PHP 5.3 and higher and show a notice when version is wrong.
if ( version_compare ( phpversion (), '5.3' , '<' ) ) {
$link_table_compatibility_notifier -> add_notification ();
return $integrations ;
}
$link_table_compatibility_notifier -> remove_notification ();
// When the table doesn't exists, just add the notification and return early.
2018-12-04 14:01:14 +01:00
if ( ! WPSEO_Link_Table_Accessible :: is_accessible () ) {
WPSEO_Link_Table_Accessible :: cleanup ();
}
if ( ! WPSEO_Meta_Table_Accessible :: is_accessible () ) {
WPSEO_Meta_Table_Accessible :: cleanup ();
}
2017-11-15 16:23:10 +01:00
if ( ! WPSEO_Link_Table_Accessible :: is_accessible () || ! WPSEO_Meta_Table_Accessible :: is_accessible () ) {
$link_table_accessible_notifier -> add_notification ();
return $integrations ;
}
$link_table_accessible_notifier -> remove_notification ();
$integrations [] = new WPSEO_Link_Columns ( new WPSEO_Meta_Storage () );
$integrations [] = new WPSEO_Link_Reindex_Dashboard ();
$integrations [] = new WPSEO_Link_Notifier ();
2017-12-13 16:03:04 +01:00
// Adds a filter to exclude the attachments from the link count.
add_filter ( 'wpseo_link_count_post_types' , array ( 'WPSEO_Post_Type' , 'filter_attachment_post_type' ) );
2017-11-15 16:23:10 +01:00
return $integrations ;
2017-06-13 09:45:37 +02:00
}
2018-12-04 14:01:14 +01:00
/* ********************* DEPRECATED METHODS ********************* */
2017-06-13 09:45:37 +02:00
2017-11-15 16:23:10 +01:00
/**
* Register the menu item and its sub menu ' s .
*
* @ deprecated 5.5
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*/
public function register_settings_page () {
_deprecated_function ( __METHOD__ , 'WPSEO 5.5.0' );
}
/**
* Register the settings page for the Network settings .
*
* @ deprecated 5.5
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*/
public function register_network_settings_page () {
_deprecated_function ( __METHOD__ , 'WPSEO 5.5.0' );
}
/**
* Load the form for a WPSEO admin page .
*
* @ deprecated 5.5
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*/
public function load_page () {
_deprecated_function ( __METHOD__ , 'WPSEO 5.5.0' );
}
/**
* Loads the form for the network configuration page .
*
* @ deprecated 5.5
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*/
public function network_config_page () {
_deprecated_function ( __METHOD__ , 'WPSEO 5.5.0' );
}
/**
* Filters all advanced settings pages from the given pages .
*
* @ deprecated 5.5
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
*
2017-11-15 16:23:10 +01:00
* @ param array $pages The pages to filter .
*/
public function filter_settings_pages ( array $pages ) {
_deprecated_function ( __METHOD__ , 'WPSEO 5.5.0' );
}
2017-06-13 09:45:37 +02:00
/**
2018-12-04 14:01:14 +01:00
* Cleans stopwords out of the slug , if the slug hasn ' t been set yet .
2017-11-15 16:23:10 +01:00
*
2018-12-04 14:01:14 +01:00
* @ deprecated 7.0
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*
2018-12-04 14:01:14 +01:00
* @ return void
2017-11-15 16:23:10 +01:00
*/
2018-12-04 14:01:14 +01:00
public function remove_stopwords_from_slug () {
_deprecated_function ( __METHOD__ , 'WPSEO 7.0' );
2017-11-15 16:23:10 +01:00
}
/**
2018-12-04 14:01:14 +01:00
* Filter the stopwords from the slug .
2017-11-15 16:23:10 +01:00
*
2018-12-04 14:01:14 +01:00
* @ deprecated 7.0
* @ codeCoverageIgnore
2017-11-15 16:23:10 +01:00
*
2018-12-04 14:01:14 +01:00
* @ return void
2017-11-15 16:23:10 +01:00
*/
2018-12-04 14:01:14 +01:00
public function filter_stopwords_from_slug () {
_deprecated_function ( __METHOD__ , 'WPSEO 7.0' );
2017-11-15 16:23:10 +01:00
}
2017-12-13 16:03:04 +01:00
/**
* Adds contextual help to the titles & metas page .
*
* @ deprecated 5.6 . 0
2018-12-04 14:01:14 +01:00
* @ codeCoverageIgnore
2017-12-13 16:03:04 +01:00
*/
public function title_metas_help_tab () {
_deprecated_function ( __METHOD__ , '5.6.0' );
$screen = get_current_screen ();
2018-12-04 14:01:14 +01:00
$screen -> set_help_sidebar (
'
2017-12-13 16:03:04 +01:00
< p >< strong > ' . __( ' For more information : ', ' wordpress - seo ' ) . ' </ strong ></ p >
< p >< a target = " _blank " href = " https://yoast.com/wordpress-seo/#titles " > ' . __( ' Title optimization ', ' wordpress - seo ' ) . ' </ a ></ p >
< p >< a target = " _blank " href = " https://yoast.com/google-page-title/ " > ' . __( ' Why Google won\ 't display the right page title' , 'wordpress-seo' ) . '</a></p>'
);
$screen -> add_help_tab (
array (
'id' => 'basic-help' ,
'title' => __ ( 'Template explanation' , 'wordpress-seo' ),
'content' => " \n \t \t <h2> " . __ ( 'Template explanation' , 'wordpress-seo' ) . " </h2> \n \t \t " . '<p>' .
sprintf (
/* translators: %1$s expands to Yoast SEO. */
__ ( 'The title & metas settings for %1$s are made up of variables that are replaced by specific values from the page when the page is displayed. The tabs on the left explain the available variables.' , 'wordpress-seo' ),
'Yoast SEO'
) .
'</p><p>' . __ ( 'Note that not all variables can be used in every template.' , 'wordpress-seo' ) . '</p>' ,
)
);
$screen -> add_help_tab (
array (
'id' => 'title-vars' ,
'title' => __ ( 'Basic Variables' , 'wordpress-seo' ),
'content' => " \n \t \t <h2> " . __ ( 'Basic Variables' , 'wordpress-seo' ) . " </h2> \n \t \t " . WPSEO_Replace_Vars :: get_basic_help_texts (),
)
);
$screen -> add_help_tab (
array (
'id' => 'title-vars-advanced' ,
'title' => __ ( 'Advanced Variables' , 'wordpress-seo' ),
'content' => " \n \t \t <h2> " . __ ( 'Advanced Variables' , 'wordpress-seo' ) . " </h2> \n \t \t " . WPSEO_Replace_Vars :: get_advanced_help_texts (),
)
);
}
2018-12-04 14:01:14 +01:00
/**
* Initializes Whip to show a notice for outdated PHP versions .
*
* @ deprecated 8.1
* @ codeCoverageIgnore
*
* @ return void
*/
public function check_php_version () {
// Intentionally left empty.
}
2017-06-13 09:45:37 +02:00
}