Search Unleashed mit Problemen unter WordPress 3.0.1

Von | 7. Oktober 2010

Ich habe heute auf einer neuen WordPress-Installation das Plugin Search Unleashed von johnny5 installiert, nach der erfolgreichen Installation des Plugins und einigen suchspezifischen Einstellungen konnte ich keine Seiten oder Artikel mehr erstellen bzw. aktualisieren.

Ein Blick in den error.log des Servers brachte Licht ins Dunkel, dort bekam ich diese Fehlermeldung PHP Fatal error: Cannot redeclare class Search_Post_Module in /plugins/search-unleashed/models/search-module.php on line 237 zu sehen. Das bedeutet, das die Klasse Search_Post_Module bereits geladen und ausgeführt wurde und diese fälschlicherweise erneut geladen werden soll.

In dem Plugin sind demnach ein paar Fehler beim includieren drin, das sollte immer mit include_once gemacht werden. Somit ist sichergestellt das jede Datei nur ein Mal geladen wird. Der folgende Code löst den Fehler also aus.

class Search_Post_Module extends Search_Module {
    function is_post() {
        return true;
    }
}

Das habe ich umgangen, in dem ich einfach eine if-Abfrage um die Klasse gesetzt habe. Die Klasse wird jetzt nicht mehr geladen, wenn Sie bereits geladen wurde.

if (!class_exists( 'Search_Post_Module' ) ) {
    class Search_Post_Module extends Search_Module {
	    function is_post() {
		    return true;
	    }
    }
}

Danach war das Problem leider noch nicht komplett behoben, ich musste diesen Schritt noch insgesamt drei weitere Male wiederholen. Danach funktionierte das Plugin genauso wie es funktionieren soll. Damit der Artikel nicht zu unübersichtlich wird, zeige ich nur noch den bereits von mir geänderten Code.

PHP Fatal error: Cannot redeclare class Search_Comment_Module in /plugins/search-unleashed/models/search-module.php on line 250

if (!class_exists( 'Search_Comment_Module' ) ) {
  class Search_Comment_Module extends Search_Module {
  	function is_comment() {
  		return true;
  	}
  }
}

PHP Fatal error: Cannot redeclare class Search_Module_Factory in /plugins/search-unleashed/models/search-module.php on line 25

if (!class_exists( 'Search_Module_Factory' ) ) {
  class Search_Module_Factory {
  	/**
  	 * Return array of active search modules
  	 *
  	 * @return array Array of modules
  	 **/
  	function running() {
  		global $search_spider;

  		$modules = array();
  		$options = $search_spider->get_options();

  		foreach ( $options['active'] AS $field ) {
  			$modules[$field] = Search_Module_Factory::get( $field );
  		}

  		return array_filter( $modules );
  	}

  	/**
  	 * Return array of all search modules
  	 *
  	 * @return array Array of modules
  	 **/
  	function available() {
  		$options = get_option( 'search_unleashed' );

  		$available = get_declared_classes();
  		$files     = glob( implode( DIRECTORY_SEPARATOR, array( dirname( __FILE__ ), '..', 'modules', '*.php' ) ) );

  		foreach ( (array)$files AS $file ) {
  			if ( file_exists( $file ) )
  				include_once $file;
  		}

  		$modules   = array();
  		$available = array_diff( get_declared_classes(), $available );

  		foreach ( (array)$available AS $name )	{
  			$name   = strtolower( $name );
  			$module = new $name();

  			if ( isset( $options['active'][$name] ) )
  				$module->active = true;

  			$module->priority = isset( $options['modules'][$name]['priority'] ) ? $options['modules'][$name]['priority'] : 1.0;
  			$modules[$name]   = $module;
  		}

  		return apply_filters( 'su_modules', $modules );
  	}

  	/**
  	 * Return a specific module
  	 *
  	 * @param string $name Module name
  	 * @return Search_Module Module
  	 **/
  	function get( $name ) {
  		$filename = implode( DIRECTORY_SEPARATOR, array( dirname( __FILE__ ), '..', 'modules', strtolower( str_replace( '_', '-', $name ) ).'.php' ) );

  		if ( file_exists( $filename ) ) {
  			include_once $filename;

  			$obj     = new $name;
  			$options = get_option( 'search_unleashed' );

  			if ( isset( $options['modules'][$name] ) ) {
  				$obj->load( $options['modules'][$name] );
  				$obj->priority = isset( $options['modules'][$name]['priority'] ) ? $options['modules'][$name]['priority'] : 1.0;
  			}

  			if ( isset( $options['active'][$name] ) )
  				$obj->active = true;

  			return $obj;
  		}

  		return false;
  	}
  }
}

PHP Fatal error: Cannot redeclare class Search_Module in /plugins/search-unleashed/models/search-module.php on line 113

if (!class_exists( 'Search_Module' ) ) {
  class Search_Module {
  	var $active   = false;
  	var $priority = 1.0;

  	/**
  	 * Pretty-print name of module
  	 *
  	 * @return string Name
  	 **/
  	function name() {
  	}

  	/**
  	 * ID for module
  	 *
  	 * @return void
  	 **/
  	function id() {
  		return strtolower( get_class( $this ) );
  	}

  	/**
  	 * Highlight a section of text
  	 *
  	 * @return void
  	 **/
  	function highlight( $post, $words, $content ) {
  		return '';
  	}

  	/**
  	 * Display edit box
  	 *
  	 * @return void
  	 **/
  	function edit() {
  	}

  	/**
  	 * Display module HTML
  	 *
  	 * @return void
  	 **/
  	function load() {
  	}

  	/**
  	 * Save module config
  	 *
  	 * @param array $data Module config
  	 * @return array Module config
  	 **/
  	function save_options( $data ) {
  		$val = $this->save( $data );
  		$val['priority'] = floatval( $_POST['priority'] );
  		return $val;
  	}

  	/**
  	 * Gather data
  	 *
  	 * @return void
  	 **/
  	function gather( $data ) {
  		return false;
  	}

  	/**
  	 * Is this a post module?
  	 *
  	 * @return boolean
  	 **/
  	function is_post() {
  		return false;
  	}

  	/**
  	 * Is this a comment module?
  	 *
  	 * @return boolean
  	 **/
  	function is_comment() {
  		return false;
  	}

  	/**
  	 * Is this module running?
  	 *
  	 * @return boolean
  	 **/
  	function is_active() {
  		return $this->active;
  	}

  	function field_name() {
  		return 'field';
  	}

  	/**
  	 * Return module field name
  	 *
  	 * @return string
  	 **/
  	function field_value( $data ) {
  		return $data;
  	}

  	/**
  	 * Save
  	 *
  	 * @return boolean
  	 **/
  	function save( $data ) {
  	}
  }
}