• Hi all!
    I am have recently updated my WP core and it created an error with the BJ lazy load plugin. in the header of my dashboard I have this error
    There is a site error displaying in the backend that says

    Deprecated: contextual_help is deprecated since version 3.3.0! Use get_current_screen()->add_help_tab(), get_current_screen()->remove_help_tab() instead. in /home1/bwmdentsu/public_html/wp-includes/functions.php on line 5088

    after deactivating each plugin one by one I came to realise lazy load was the culprit. I found in the file /BJ lazy load/bj-lazy-load/inc/scb/AdminPage.php the following code. I am not sure how to udpate it to fix the issue, any idea???

    add_filter( 'contextual_help', array( $this, '_contextual_help' ), 10, 2 );

    then

    `function _contextual_help( $help, $screen ) {
    if ( is_object( $screen ) )
    $screen = $screen->id;

    $actual_help = $this->page_help();

    if ( $screen == $this->pagehook && $actual_help )
    return $actual_help;

    return $help;
    }`

    here is the whole file

    <?php
    
    /**
     * Administration page base class
     */
    abstract class scbAdminPage {
    	/** Page args
    	 * $page_title string (mandatory)
    	 * $parent (string)  (default: options-general.php)
    	 * $capability (string)  (default: 'manage_options')
    	 * $menu_title (string)  (default: $page_title)
    	 * $submenu_title (string)  (default: $menu_title)
    	 * $page_slug (string)  (default: sanitized $page_title)
    	 * $toplevel (string)  If not empty, will create a new top level menu (for expected values see https://codex.www.ads-software.com/Administration_Menus#Using_add_submenu_page)
    	 * - $icon_url (string)  URL to an icon for the top level menu
    	 * - $position (int)  Position of the toplevel menu (caution!)
    	 * $screen_icon (string)  The icon type to use in the screen header
    	 * $nonce string  (default: $page_slug)
    	 * $action_link (string|bool)  Text of the action link on the Plugins page (default: 'Settings')
    	 * $admin_action_priority int  The priority that the admin_menu action should be executed at (default: 10)
    	 */
    	protected $args;
    
    	// URL to the current plugin directory.
    	// Useful for adding css and js files
    	protected $plugin_url;
    
    	// Created at page init
    	protected $pagehook;
    
    	// scbOptions object holder
    	// Normally, it's used for storing formdata
    	protected $options;
    	protected $option_name;
    
    	// l10n
    	protected $textdomain;
    
    //  ____________REGISTRATION COMPONENT____________
    
    	private static $registered = array();
    
    	/**
    	 * @param string     $class
    	 * @param string     $file
    	 * @param scbOptions $options
    	 *
    	 * @return bool
    	 */
    	static function register( $class, $file, $options = null ) {
    		if ( isset( self::$registered[$class] ) )
    			return false;
    
    		self::$registered[$class] = array( $file, $options );
    
    		add_action( '_admin_menu', array( __CLASS__, '_pages_init' ) );
    
    		return true;
    	}
    
    	/**
    	 * @param string $old_class
    	 * @param string $new_class
    	 *
    	 * @return bool
    	 */
    	static function replace( $old_class, $new_class ) {
    		if ( ! isset( self::$registered[$old_class] ) )
    			return false;
    
    		self::$registered[$new_class] = self::$registered[$old_class];
    		unset( self::$registered[$old_class] );
    
    		return true;
    	}
    
    	/**
    	 * @param string $class
    	 *
    	 * @return bool
    	 */
    	static function remove( $class ) {
    		if ( ! isset( self::$registered[$class] ) )
    			return false;
    
    		unset( self::$registered[$class] );
    
    		return true;
    	}
    
    	static function _pages_init() {
    		foreach ( self::$registered as $class => $args )
    			new $class( $args[0], $args[1] );
    	}
    
    //  ____________MAIN METHODS____________
    
    	/**
    	 * Constructor
    	 *
    	 * @param string|bool $file
    	 * @param scbOptions  $options
    	 */
    	function __construct( $file = false, $options = null ) {
    		if ( is_a( $options, 'scbOptions' ) )
    			$this->options = $options;
    
    		$this->setup();
    		$this->check_args();
    
    		if ( isset( $this->option_name ) ) {
    			add_action( 'admin_init', array( $this, 'option_init' ) );
    			if ( function_exists( 'settings_errors' ) )
    				add_action( 'admin_notices', 'settings_errors' );
    		}
    
    		add_action( 'admin_menu', array( $this, 'page_init' ), $this->args['admin_action_priority'] );
    		add_filter( 'contextual_help', array( $this, '_contextual_help' ), 10, 2 );
    		
    		
    		
    		
    
    		if ( $file ) {
    			$this->file = $file;
    			$this->plugin_url = plugin_dir_url( $file );
    
    			if ( $this->args['action_link'] )
    				add_filter( 'plugin_action_links_' . plugin_basename( $file ), array( $this, '_action_link' ) );
    		}
    	}
    
    	/**
    	 * This is where all the page args can be set
    	 */
    	function setup(){}
    
    	/**
    	 * Called when the page is loaded, but before any rendering.
    	 *
    	 * Useful for calling $screen->add_help_tab() etc.
    	 */
    	function page_loaded() {}
    
    	/**
    	 * This is where the css and js go
    	 * Both wp_enqueue_*() and inline code can be added
    	 */
    	function page_head(){}
    
    	/**
    	 * This is where the contextual help goes
    	 * @return string
    	 */
    	function page_help(){}
    
    	/**
    	 * A generic page header
    	 */
    	function page_header() {
    		echo "<div class='wrap'>\n";
    		screen_icon( $this->args['screen_icon'] );
    		echo html( 'h2', $this->args['page_title'] );
    	}
    
    	/**
    	 * This is where the page content goes
    	 */
    	abstract function page_content();
    
    	/**
    	 * A generic page footer
    	 */
    	function page_footer() {
    		echo "</div>\n";
    	}
    
    	/**
    	 * This is where the form data should be validated
    	 *
    	 * @param array $new_data
    	 * @param array $old_data
    	 *
    	 * @return array
    	 */
    	function validate( $new_data, $old_data ) {
    		return $new_data;
    	}
    
    	/**
    	 * Manually handle option saving ( use Settings API instead )
    	 *
    	 * @return bool
    	 */
    	function form_handler() {
    		if ( empty( $_POST['submit'] ) && empty( $_POST['action'] ) )
    			return false;
    
    		check_admin_referer( $this->nonce );
    
    		if ( !isset($this->options) ) {
    			trigger_error( 'options handler not set', E_USER_WARNING );
    			return false;
    		}
    
    		$new_data = wp_array_slice_assoc( $_POST, array_keys( $this->options->get_defaults() ) );
    
    		$new_data = stripslashes_deep( $new_data );
    
    		$new_data = $this->validate( $new_data, $this->options->get() );
    
    		$this->options->set( $new_data );
    
    		$this->admin_msg();
    
    		return true;
    	}
    
    	/**
    	 * Manually generate a standard admin notice ( use Settings API instead )
    	 *
    	 * @param string $msg
    	 * @param string $class
    	 */
    	function admin_msg( $msg = '', $class = 'updated' ) {
    		if ( empty( $msg ) )
    			$msg = __( 'Settings <strong>saved</strong>.', $this->textdomain );
    
    		echo scb_admin_notice( $msg, $class );
    	}
    
    //  ____________UTILITIES____________
    
    	/**
    	 * Generates a form submit button
    	 *
    	 * @param string|array $value  button text or array of arguments
    	 * @param string       $action
    	 * @param string       $class
    	 *
    	 * @return string
    	 */
    	function submit_button( $value = '', $action = 'submit', $class = 'button button-primary' ) {
    
    		$args = is_array( $value ) ? $value : compact( 'value', 'action', 'class' );
    		$args = wp_parse_args( $args, array(
    			'value'  => null,
    			'action' => $action,
    			'class'  => $class,
    		) );
    
    		return get_submit_button( $args['value'], $args['class'], $args['action'] );
    	}
    
    	/**
    	 * Mimics scbForms::form_wrap()
    	 *
    	 * $this->form_wrap( $content );  // generates a form with a default submit button
    	 *
    	 * $this->form_wrap( $content, false ); // generates a form with no submit button
    	 *
    	 *  // the second argument is sent to submit_button()
    	 *  $this->form_wrap( $content, array(
    	 *      'text' => 'Save changes',
    	 *      'name' => 'action',
    	 *  ) );
    	 *
    	 * @see scbForms::form_wrap()
    	 *
    	 * @param string               $content
    	 * @param boolean|string|array $submit_button
    	 *
    	 * @return string
    	 */
    	function form_wrap( $content, $submit_button = true ) {
    		if ( is_array( $submit_button ) ) {
    			$content .= $this->submit_button( $submit_button );
    		} elseif ( true === $submit_button ) {
    			$content .= $this->submit_button();
    		} elseif ( false !== strpos( $submit_button, '<input' ) ) {
    			$content .= $submit_button;
    		} elseif ( false !== strpos( $submit_button, '<button' ) ) {
    			$content .= $submit_button;
    		} elseif ( false !== $submit_button ) {
    			$button_args = array_slice( func_get_args(), 1 );
    			$content    .= call_user_func_array( array( $this, 'submit_button' ), $button_args );
    		}
    
    		return scbForms::form_wrap( $content, $this->nonce );
    	}
    
    	/**
    	 * Generates a table wrapped in a form
    	 *
    	 * @param array         $rows
    	 * @param array|boolean $formdata
    	 *
    	 * @return string
    	 */
    	function form_table( $rows, $formdata = false ) {
    		$output = '';
    		foreach ( $rows as $row )
    			$output .= $this->table_row( $row, $formdata );
    
    		$output = $this->form_table_wrap( $output );
    
    		return $output;
    	}
    
    	/**
    	 * Wraps the given content in a <form><table>
    	 *
    	 * @param string $content
    	 *
    	 * @return string
    	 */
    	function form_table_wrap( $content ) {
    		$output = $this->table_wrap( $content );
    		$output = $this->form_wrap( $output );
    
    		return $output;
    	}
    
    	/**
    	 * Generates a form table
    	 *
    	 * @param array         $rows
    	 * @param array|boolean $formdata
    	 *
    	 * @return string
    	 */
    	function table( $rows, $formdata = false ) {
    		$output = '';
    		foreach ( $rows as $row )
    			$output .= $this->table_row( $row, $formdata );
    
    		$output = $this->table_wrap( $output );
    
    		return $output;
    	}
    
    	/**
    	 * Generates a table row
    	 *
    	 * @param array         $args
    	 * @param array|boolean $formdata
    	 *
    	 * @return string
    	 */
    	function table_row( $args, $formdata = false ) {
    		return $this->row_wrap( $args['title'], $this->input( $args, $formdata ) );
    	}
    
    	/**
    	 * Mimic scbForms inheritance
    	 *
    	 * @see scbForms
    	 *
    	 * @param string $method
    	 * @param array  $args
    	 *
    	 * @return mixed
    	 */
    	function __call( $method, $args ) {
    		if ( in_array( $method, array( 'input', 'form' ) ) ) {
    			if ( empty( $args[1] ) && isset( $this->options ) )
    				$args[1] = $this->options->get();
    
    			if ( 'form' == $method )
    				$args[2] = $this->nonce;
    		}
    
    		return call_user_func_array( array( 'scbForms', $method ), $args );
    	}
    
    	/**
    	 * Wraps a string in a <script> tag
    	 *
    	 * @param string $string
    	 *
    	 * @return string
    	 */
    	function js_wrap( $string ) {
    		return html( "script type='text/javascript'", $string );
    	}
    
    	/**
    	 * Wraps a string in a <style> tag
    	 *
    	 * @param string $string
    	 *
    	 * @return string
    	 */
    	function css_wrap( $string ) {
    		return html( "style type='text/css'", $string );
    	}
    
    //  ____________INTERNAL METHODS____________
    
    	/**
    	 * Registers a page
    	 */
    	function page_init() {
    
    		if ( ! $this->args['toplevel'] ) {
    			$this->pagehook = add_submenu_page(
    				$this->args['parent'],
    				$this->args['page_title'],
    				$this->args['menu_title'],
    				$this->args['capability'],
    				$this->args['page_slug'],
    				array( $this, '_page_content_hook' )
    			);
    		} else {
    			$func = 'add_' . $this->args['toplevel'] . '_page';
    			$this->pagehook = $func(
    				$this->args['page_title'],
    				$this->args['menu_title'],
    				$this->args['capability'],
    				$this->args['page_slug'],
    				null,
    				$this->args['icon_url'],
    				$this->args['position']
    			);
    
    			add_submenu_page(
    				$this->args['page_slug'],
    				$this->args['page_title'],
    				$this->args['submenu_title'],
    				$this->args['capability'],
    				$this->args['page_slug'],
    				array( $this, '_page_content_hook' )
    			);
    		}
    
    		if ( ! $this->pagehook )
    			return;
    
    		add_action( 'load-' . $this->pagehook, array( $this, 'page_loaded' ) );
    
    		add_action( 'admin_print_styles-' . $this->pagehook, array( $this, 'page_head' ) );
    	}
    
    	function option_init() {
    		register_setting( $this->option_name, $this->option_name, array( $this, 'validate' ) );
    	}
    
    	private function check_args() {
    		if ( empty( $this->args['page_title'] ) )
    			trigger_error( 'Page title cannot be empty', E_USER_WARNING );
    
    		$this->args = wp_parse_args( $this->args, array(
    			'toplevel'              => '',
    			'position'              => null,
    			'icon_url'              => '',
    			'screen_icon'           => '',
    			'parent'                => 'options-general.php',
    			'capability'            => 'manage_options',
    			'menu_title'            => $this->args['page_title'],
    			'page_slug'             => '',
    			'nonce'                 => '',
    			'action_link'           => __( 'Settings', $this->textdomain ),
    			'admin_action_priority' => 10,
    		) );
    
    		if ( empty( $this->args['submenu_title'] ) )
    			$this->args['submenu_title'] = $this->args['menu_title'];
    
    		if ( empty( $this->args['page_slug'] ) )
    			$this->args['page_slug'] = sanitize_title_with_dashes( $this->args['menu_title'] );
    
    		if ( empty( $this->args['nonce'] ) )
    			$this->nonce = $this->args['page_slug'];
    	}
    
    	/**
    	 * @param string        $help
    	 * @param string|object $screen
    	 *
    	 * @return string
    	 */
    	function _contextual_help( $help, $screen ) {
    		if ( is_object( $screen ) )
    			$screen = $screen->id;
    
    		$actual_help = $this->page_help();
    
    		if ( $screen == $this->pagehook && $actual_help )
    			return $actual_help;
    
    		return $help;
    	}
    
    	function _page_content_hook() {
    		$this->form_handler();
    
    		$this->page_header();
    		$this->page_content();
    		$this->page_footer();
    	}
    
    	/**
    	 * @param array $links
    	 *
    	 * @return array
    	 */
    	function _action_link( $links ) {
    		$url = add_query_arg( 'page', $this->args['page_slug'], admin_url( $this->args['parent'] ) );
    
    		$links[] = html_link( $url, $this->args['action_link'] );
    
    		return $links;
    	}
    }
    
    
Viewing 3 replies - 1 through 3 (of 3 total)
  • breaking the site
    thanks to the deprecated “contextual_help”

    ./wp-content/plugins/bj-lazy-load/inc/scb/AdminPage.php:		add_filter( 'contextual_help', array( $this, '_contextual_help' ), 10, 2 );
    ./wp-content/plugins/bj-lazy-load/inc/scb/AdminPage.php:	function _contextual_help( $help, $screen ) { 

    You should not use any more this plugin. On WordPress 5.5 will be integrated the LazyLoading native html tag as default for all images so this plugin is just deprecating on a few weeks.

    I wouldn’t say that this plugin is unnecessary. Although wordpress has implemented native lazy load, there are several browsers like Safari that don’t support it yet. In addition, this plugin offers additional functionalities that are not in the native lazy load such as configuring the threshold, the filter to add lazy load to template images or the support for initially hidden images.

    I definitely think it’s better to use this plugin than the native functionality of wordpress.

Viewing 3 replies - 1 through 3 (of 3 total)
  • The topic ‘plugin causing WP issue’ is closed to new replies.