Support » Plugin: Disable New User Notification Emails » Doesn't work with 4.4.2

Viewing 10 replies - 1 through 10 (of 10 total)
  • JohnnieGR

    (@johnniegr)

    Same here 🙁

    same here…

    Me too. The subject line appears thus:

    [Name of Site] Ne XXXXXXXXXXXXXXXXXXXXXX w User Registration

    After wondering why it is not working as it should, I checked the code and found that a very small change results in this plugin not working. Since I am not the plugin author, I am not able to publish the change as an update to the plugin, but I can post it here for those of you interested (it means that you will need to edit the plugin or your themes functions file or add it as a separate plugin – last 2 options will require you to disable this plugin).

    The core of this plugin is simply overwrite the builtin WP function sending the emails, that means that the core WP function should be duplicated with only the changes you need (either adding or deleting lines).

    In the latest WP version (at time of writing; 4.5.2) the function in question looks like:

    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
    	if ( $deprecated !== null ) {
    		_deprecated_argument( __FUNCTION__, '4.3.1' );
    	}
    
    	global $wpdb, $wp_hasher;
    	$user = get_userdata( $user_id );
    
    	// The blogname option is escaped with esc_html on the way into the database in sanitize_option
    	// we want to reverse this for the plain text arena of emails.
    	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    
    	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
    	$message .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= sprintf(__('Email: %s'), $user->user_email) . "\r\n";
    
    	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
    
    	// $deprecated was pre-4.3 $plaintext_pass. An empty $plaintext_pass didn't sent a user notification.
    	if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) {
    		return;
    	}
    
    	// Generate something random for a password reset key.
    	$key = wp_generate_password( 20, false );
    
    	/** This action is documented in wp-login.php */
    	do_action( 'retrieve_password_key', $user->user_login, $key );
    
    	// Now insert the key, hashed, into the DB.
    	if ( empty( $wp_hasher ) ) {
    		require_once ABSPATH . WPINC . '/class-phpass.php';
    		$wp_hasher = new PasswordHash( 8, true );
    	}
    	$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    	$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
    
    	$message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= __('To set your password, visit the following address:') . "\r\n\r\n";
    	$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
    
    	$message .= wp_login_url() . "\r\n";
    
    	wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);
    }

    The line that does the sending of the notification is the one:
    @wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);

    To disable it, all we need to do is add 2 slashes before it like:
    //@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);

    I my case I decided I will edit the plugin directly (so that if this plugin is ever updated, I will go to the new version). My final file contents:

    <?php
    /**
     * Plugin Name: Disable New User Notifications
     * Plugin URI:  https://thomasgriffin.io
     * Description: Disables new user notification emails.
     * Author:      Thomas Griffin
     * Author URI:  http://thomasgriffin.io
     * Version:     1.0.2
     *
     * Disable New User Notifications is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 2 of the License, or
     * any later version.
     *
     * Disable New User Notifications is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
     * GNU General Public License for more details.
     *
     * You should have received a copy of the GNU General Public License
     * along with Disable New User Notifications. If not, see <http://www.gnu.org/licenses/>.
     */
    
    // Exit if accessed directly.
    if ( ! defined( 'ABSPATH' ) ) {
        exit;
    }
    
    if ( ! function_exists( 'wp_new_user_notification' ) ) {
    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
    	if ( $deprecated !== null ) {
    		_deprecated_argument( __FUNCTION__, '4.3.1' );
    	}
    
    	global $wpdb, $wp_hasher;
    	$user = get_userdata( $user_id );
    
    	// The blogname option is escaped with esc_html on the way into the database in sanitize_option
    	// we want to reverse this for the plain text arena of emails.
    	$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
    
    	$message  = sprintf(__('New user registration on your site %s:'), $blogname) . "\r\n\r\n";
    	$message .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= sprintf(__('Email: %s'), $user->user_email) . "\r\n";
    
    	//@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
    
    	// $deprecated was pre-4.3 $plaintext_pass. An empty $plaintext_pass didn't sent a user notifcation.
    	if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) {
    		return;
    	}
    
    	// Generate something random for a password reset key.
    	$key = wp_generate_password( 20, false );
    
    	/** This action is documented in wp-login.php */
    	do_action( 'retrieve_password_key', $user->user_login, $key );
    
    	// Now insert the key, hashed, into the DB.
    	if ( empty( $wp_hasher ) ) {
    		require_once ABSPATH . WPINC . '/class-phpass.php';
    		$wp_hasher = new PasswordHash( 8, true );
    	}
    	$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    	$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
    
    	$message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    	$message .= __('To set your password, visit the following address:') . "\r\n\r\n";
    	$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
    
    	$message .= wp_login_url() . "\r\n";
    
    	wp_mail($user->user_email, sprintf(__('[%s] Your username and password info'), $blogname), $message);
    }
    }
    
    //require plugin_dir_path( __FILE__ ) . 'utils.php';

    If you did everything correctly, you should stop getting these emails.

    Thread Starter DidierMalenfant

    (@didiermalenfant)

    If you go back to the original code in the plugin, you’ll notice that this @wp_mail is already removed.

    I wonder why your version successfully stops the emails and the posted version doesn’t.

    My code also works since it (the sending line) is commented out (the 2 slashes I added before it). It remains there, but is never executed (since this is based on other people’s code, I comment out what I do not need – it gives me a reference and context).

    If you want to remove it completely, it will also work.

    My version also is meant for the current version of WP (which, if you have an issue with this plugin, you most probably have), since I do not have the version compare.

    Thread Starter DidierMalenfant

    (@didiermalenfant)

    I don’t think I explained myself correctly. Your code comments out a line that is NOT present in the plugin. Here is the plugin code as of version 1.0.2:

    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
    			if ( $deprecated !== null ) {
    				_deprecated_argument( __FUNCTION__, '4.3.1' );
    			}
    
    			// <code>$deprecated was pre-4.3</code>$plaintext_pass<code>. An empty</code>$plaintext_pass
    
     didn't sent a user notifcation.
    			if ( 'admin' === $notify || ( empty( $deprecated ) && empty( $notify ) ) ) {
    				return;
    			}
    
    			global $wpdb, $wp_hasher;
    			$user = get_userdata( $user_id );
    
    			// The blogname option is escaped with esc_html on the way into the database in sanitize_option
    			// we want to reverse this for the plain text arena of emails.
    			$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
    
    			// Generate something random for a password reset key.
    			$key = wp_generate_password( 20, false );
    
    			/** This action is documented in wp-login.php */
    			do_action( 'retrieve_password_key', $user->user_login, $key );
    
    			// Now insert the key, hashed, into the DB.
    			if ( empty( $wp_hasher ) ) {
    				require_once ABSPATH . WPINC . '/class-phpass.php';
    				$wp_hasher = new PasswordHash( 8, true );
    			}
    			$hashed = time() . ':' . $wp_hasher->HashPassword( $key );
    			$wpdb->update( $wpdb->users, array( 'user_activation_key' => $hashed ), array( 'user_login' => $user->user_login ) );
    
    			$message = sprintf( __( 'Username: %s' ), $user->user_login ) . "\r\n\r\n";
    			$message .= __( 'To set your password, visit the following address:' ) . "\r\n\r\n";
    			$message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user->user_login ), 'login' ) . ">\r\n\r\n";
    
    			$message .= wp_login_url() . "\r\n";
    
    			wp_mail( $user->user_email, sprintf( __( '[%s] Your username and password info' ), $blogname ), $message );
    		}

    So whatever you fixed is not because of that line you commented out because it’s not there in the plugin right now anyway.

    I’m not saying you didn’t fix anything, I’m trying to understand what you actually fixed.

    WordPress, in its core defined the wp_new_user_notification function (file: wp-includes/pluggable.php – https://core.trac.wordpress.org/browser/tags/4.5.2/src/wp-includes/pluggable.php#L1685) as a pluggable function (basically a function which can be overwritten by a plugin or theme; if it does not exist at a certain point, the WP builtin default will be used).

    I copied this function from the pluggable.php file (since it most certainly work with the current version) and made the 1 change to comment out the line that send the admin email.

    Since it is pluggable, and directly in the Theme’s main file (not inside another function or other page waiting for a specific action) it is getting defined at the action loading plugins (unless an other plugin defined it first). This then overwrites the need for the default function and works.

    If you want to you can compare the original plugin and the pluggable function to see what is the difference – I just decided start with what works, and remove what I do not want.

    Thread Starter DidierMalenfant

    (@didiermalenfant)

    I understand what you did. I did compare both versions.

    But, again, the line you commented out in your version was not in the plugin anyway.

    By copying from the wp source code you added this line, then commented it out. So whatever you fixed is not related to this line.

    That’s what I trying to say.

    No luck with the above code, but thanks for the attempt!

Viewing 10 replies - 1 through 10 (of 10 total)
  • The topic ‘Doesn't work with 4.4.2’ is closed to new replies.