, Github: https://github.com/alexkovalevv * * @copyright (c) 2017 Webraftic Ltd */ class WbcrCmp_ConfigComments extends WBCR\Factory_Templates_108\Configurate { private $modified_types = []; /** * @param Wbcr_Factory456_Plugin $plugin */ public function __construct( Wbcr_Factory456_Plugin $plugin ) { parent::__construct( $plugin ); $this->plugin = $plugin; } public function registerActionsAndFilters() { // These need to happen now if ( $this->isDisabledAllPosts() ) { add_action( 'widgets_init', [ $this, 'disableRcWidget' ] ); add_action( 'template_redirect', [ $this, 'filterQuery' ], 9 ); // before redirect_canonical // Admin bar filtering has to happen here since WP 3.6 add_action( 'template_redirect', [ $this, 'filterAdminBar' ] ); add_action( 'admin_init', [ $this, 'filterAdminBar' ] ); } else { if ( $this->getPopulateOption( 'comment_text_convert_links_pseudo' ) || $this->getPopulateOption( 'pseudo_comment_author_link' ) ) { add_action( 'wp_enqueue_scripts', [ $this, 'assetsUrlSpanScripts' ] ); } if ( $this->getPopulateOption( 'comment_text_convert_links_pseudo' ) ) { add_filter( 'comment_text', [ $this, 'commentTextConvertLinksPseudo' ] ); } if ( $this->getPopulateOption( 'pseudo_comment_author_link' ) ) { add_filter( 'get_comment_author_link', [ $this, 'pseudoCommentAuthorLink' ], 100, 3 ); } if ( $this->getPopulateOption( 'remove_url_from_comment_form' ) ) { add_filter( 'comment_form_default_fields', [ $this, 'removeUrlFromCommentForm' ] ); } } // These can happen later //add_action('plugins_loaded', array($this, 'register_text_domain')); add_action( 'wp_loaded', [ $this, 'initWploadedFilters' ] ); } /* * Remove comment links from the admin bar in a multisite network. */ public function removeNetworkCommentLinks( $wp_admin_bar ) { if ( $this->plugin->isNetworkActive() && is_user_logged_in() ) { foreach ( (array) $wp_admin_bar->user->blogs as $blog ) { $wp_admin_bar->remove_menu( 'blog-' . $blog->userblog_id . '-c' ); } } else { // We have no way to know whether the plugin is active on other sites, so only remove this one $wp_admin_bar->remove_menu( 'blog-' . get_current_blog_id() . '-c' ); } } private function isDisabledAllPosts() { return $this->getPopulateOption( 'disable_comments', 'enable_comments' ) == 'disable_comments'; } private function isDisabledCertainPostTypes() { return $this->getPopulateOption( 'disable_comments', 'enable_comments' ) == 'disable_certain_post_types_comments'; } private function isEnabledComments() { return $this->getPopulateOption( 'disable_comments', 'enable_comments' ) == 'enable_comments'; } /* * Get an array of disabled post type. */ private function getDisabledPostTypes() { return wbcr_cmp_get_disabled_post_types(); } /* * Check whether comments have been disabled on a given post type. */ private function isPostTypeDisabled( $type ) { return $this->isDisabledCertainPostTypes() && in_array( $type, $this->getDisabledPostTypes() ); } public function initWploadedFilters() { $disabled_post_types = $this->getDisabledPostTypes(); if ( ! empty( $disabled_post_types ) && ! $this->isEnabledComments() ) { foreach ( $disabled_post_types as $type ) { // we need to know what native support was for later if ( post_type_supports( $type, 'comments' ) ) { $this->modified_types[] = $type; remove_post_type_support( $type, 'comments' ); remove_post_type_support( $type, 'trackbacks' ); } } add_filter( 'comments_array', [ $this, 'filterExistingComments' ], 20, 2 ); add_filter( 'comments_open', [ $this, 'filterCommentStatus' ], 20, 2 ); add_filter( 'pings_open', [ $this, 'filterCommentStatus' ], 20, 2 ); } // Filters for the admin only if ( is_admin() ) { add_action( 'admin_print_footer_scripts', [ $this, 'discussionNotice' ] ); // if only certain types are disabled, remember the original post status if ( ! $this->isDisabledAllPosts() ) { add_action( 'edit_form_advanced', [ $this, 'editFormInputs' ] ); add_action( 'edit_page_form', [ $this, 'editFormInputs' ] ); } else { add_action( 'admin_menu', [ $this, 'filterAdminMenu' ], 9999 ); // do this as late as possible add_action( 'admin_print_footer_scripts-index.php', [ $this, 'dashboardJs' ] ); add_action( 'wp_dashboard_setup', [ $this, 'filterDashboard' ] ); add_filter( 'pre_option_default_pingback_flag', '__return_zero' ); } } // Filters for front end only else { add_action( 'template_redirect', [ $this, 'checkCommentTemplate' ] ); if ( $this->isDisabledAllPosts() ) { add_filter( 'feed_links_show_comments_feed', '__return_false' ); } } } /* * Replace the theme's comment template with a blank one. * To prevent this, define DISABLE_COMMENTS_REMOVE_COMMENTS_TEMPLATE * and set it to True */ public function checkCommentTemplate() { if ( is_singular() && ( $this->isDisabledAllPosts() || $this->isPostTypeDisabled( get_post_type() ) ) ) { if ( ! defined( 'DISABLE_COMMENTS_REMOVE_COMMENTS_TEMPLATE' ) || DISABLE_COMMENTS_REMOVE_COMMENTS_TEMPLATE == true ) { // Kill the comments template. add_filter( 'comments_template', [ $this, 'dummyCommentsTemplate' ], 20 ); } // Remove comment-reply script for themes that include it indiscriminately wp_deregister_script( 'comment-reply' ); // feed_links_extra inserts a comments RSS link remove_action( 'wp_head', 'feed_links_extra', 3 ); } } public function dummyCommentsTemplate() { return WCM_PLUGIN_DIR . '/includes/comments-template.php'; } /* * Issue a 403 for all comment feed requests. */ public function filterQuery() { if ( is_comment_feed() ) { wp_die( __( 'Comments are closed.' ), '', [ 'response' => 403 ] ); } } /* * Remove comment links from the admin bar. */ public function filterAdminBar() { if ( is_admin_bar_showing() ) { // Remove comments links from admin bar remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); } if ( is_multisite() ) { add_action( 'admin_bar_menu', [ $this, 'removeNetworkCommentLinks' ], 500 ); } } public function editFormInputs() { global $post; // Without a dicussion meta box, comment_status will be set to closed on new/updated posts if ( in_array( $post->post_type, $this->modified_types ) ) { echo ''; } } public function discussionNotice() { $disabled_post_types = $this->getDisabledPostTypes(); if ( get_current_screen()->id == 'options-discussion' && ! empty( $disabled_post_types ) ) { $names = []; foreach ( $disabled_post_types as $type ) { $type_object = get_post_type_object( $type ); if ( empty( $type_object ) ) { continue; } $names[ $type ] = $type_object->labels->name; } ?> 403 ] ); } remove_menu_page( 'edit-comments.php' ); remove_submenu_page( 'options-general.php', 'options-discussion.php' ); } public function filterDashboard() { remove_meta_box( 'dashboard_recent_comments', 'dashboard', 'normal' ); } public function dashboardJs() { echo ''; } public function filterExistingComments( $comments, $post_id ) { $post = get_post( $post_id ); return ( $this->isDisabledAllPosts() || $this->isPostTypeDisabled( $post->post_type ) ) ? [] : $comments; } public function filterCommentStatus( $open, $post_id ) { $post = get_post( $post_id ); return ( $this->isDisabledAllPosts() || $this->isPostTypeDisabled( $post->post_type ) ) ? false : $open; } public function disableRcWidget() { unregister_widget( 'WP_Widget_Recent_Comments' ); } /** * Convert links in comment text into span pseudo links * * @param $comment_text * * @return mixed */ public function commentTextConvertLinksPseudo( $comment_text ) { return $this->convertLinksPseudo( $comment_text ); } /** * Convert links into span pseudo links * * @param $text * * @return mixed */ public function convertLinksPseudo( $text ) { return preg_replace_callback( '/]+href=[\'"](https?:\/\/[^"\']+)[\'"][^>]+>(.*?)<\/a>/i', [ $this, 'replaceLinks' ], $text ); } public function replaceLinks( $matches ) { if ( $matches[1] == get_home_url() ) { return $matches[0]; } return ' ' . $matches[2] . ''; } /** * Convert author link to pseudo link * * @return string */ public function pseudoCommentAuthorLink( $return, $author, $comment_ID ) { $url = get_comment_author_url( $comment_ID ); $author = get_comment_author( $comment_ID ); if ( empty( $url ) || 'http://' == $url ) { $return = $author; } else { $return = '' . $author . ''; } return $return; } /** * Remove url field from comment form * * @param $fields * * @return mixed */ public function removeUrlFromCommentForm( $fields ) { if ( isset( $fields['url'] ) ) { unset( $fields['url'] ); } return $fields; } // todo: Убрать это грязное решение со скриптами. public function assetsUrlSpanScripts() { if ( ! is_singular() ) { return; } wp_enqueue_style( 'wbcr-comments-plus-url-span', WCM_PLUGIN_URL . '/assets/css/url-span.css', [], $this->plugin->getPluginVersion() ); wp_enqueue_script( 'wbcr-comments-plus-url-span', WCM_PLUGIN_URL . '/assets/js/url-span.js', [ 'jquery' ], $this->plugin->getPluginVersion(), true ); } }