Schlagwort-Archiv: php

Standard WordPress Plugin Funktionen

Zwei der Funktionen/Methoden die man in zufunkt wohl in allen meinen Plugins finden wird sind:
Voraussetzung ist PHP 5.1.2 für die Autoload Funktion.

1. Zum ermitteln von Plugin Daten, damit nicht immer alles per Constante definiert wird um Namensraum freizuhalten:

public static function get_plugin_data($get_data=false) {
$plugin_data=wp_cache_get('plugin_data','pluginname');
if ($plugin_data === false || empty($plugin_data['Version'])) {
$plugin_data = get_file_data( __FILE__, array(
'Name' => 'Plugin Name',
'PluginURI' => 'Plugin URI',
'Version' => 'Version',
'Description' => 'Description',
'Author' => 'Author',
'AuthorURI' => 'Author URI',
'TextDomain' => 'Text Domain',
'DomainPath' => 'Domain Path'
), 'plugin' );
$plugin_data['BaseName']=plugin_basename(__FILE__);
$plugin_data['Folder']=dirname( plugin_basename( __FILE__ ) );
$plugin_data['URL']=plugins_url( '', __FILE__ );
if (defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG)
$plugin_data['JSVersion']=time();
else
$plugin_data['JSVersion']=$plugin_data['Version'];
wp_cache_add('plugin_data',$plugin_data,'pluginname');
}

if (!$get_data)
return $plugin_data;
return $plugin_data[$get_data];
}

2. Die Autoload Funktion von PHP zum automatischen laden von Klassen damit sie nur dann geladen werden wenn Sie auch benötigt werden. Das heißt verwend man ein “add_action” wird die classe erst geladen wenn wirklich ein “do_action” erfolgt oder die Seiten klasse für einen Menü Eintrag erst geladen wird wenn der Menüpunkt tatsächlich aufgerufen wird. Voraussetzung ist das man das ganze Plugin Klassen basierend aufbaut. Das kann dann nicht nur Ressourcen Sparen.

public function __construct() {
//register autoloader
spl_autoload_register( array( $this, 'autoloader' ) );
}
public static function autoloader( $class_name ) {
//WordPress classes loader
$wpclass='/class-'.strtolower(str_replace('_','-',$class_name)).'.php';
if ( is_file(ABSPATH .'wp-admin'.DIRECTORY_SEPARATOR.'includes'.$wpclass) ) {
require(ABSPATH .'wp-admin'.DIRECTORY_SEPARATOR.'includes'.$wpclass);
return true;
}
if ( is_file(ABSPATH . WPINC . $wpclass) ) {
require(ABSPATH . WPINC . $wpclass);
return true;
}

//Plugin classes to load
if ( strpos( $class_name,'PluginClass_') !== false ) {
$class_load = dirname( __FILE__ ) . DIRECTORY_SEPARATOR.'inc'.DIRECTORY_SEPARATOR.'class-' . strtolower( str_replace( array( 'PluginClass_', '_' ), array( '', '-' ), $class_name ) ) . '.php';
if ( is_file( $class_load ) ) {
require($class_load);
return true;
}

}
return false;
}

Diese sollten sich innerhalb der Haupt Plugin Datei in einer Klasse befinden.

PHP Verzeichnis Übergabe prüfen

Ich muss in meinem Plugin für WordPress den ABSPATH übergeben um eine eigene Ajax Behandlung zu haben.
Was meint ihr ist der Code schnipsel dafür geeignet um es möglicht sicher gegen Angriffe zu machen ?

if ( is_file( dirname(dirname(dirname(dirname( __FILE__ )))).'/wp-load.php' ) ) {
require_once(dirname(dirname(dirname(dirname( __FILE__ )))).'/wp-load.php');
} else {
$abspath = filter_input( INPUT_POST, 'ABSPATH', FILTER_SANITIZE_URL );
$abspath = rtrim(realpath($abspath), '/\' );
if ( ! empty($abspath) && is_dir( $abspath . '/' ) && is_file( realpath( $abspath . '/wp-load.php' ) ) ) {
require_once($abspath . '/wp-load.php');
} else {
die();
}
}

Erläuterung:
Wenn der Plugins Ordner im Standard Verzeichnis ist oder zumindest in der selben Verzeichnis Tiefe muss die Übergabe nicht genutzt werden.
Sonst.
Das übergebene Verzeichnis vorfiltern (nur in URLs erlaubte Zeichen werden zugelassen)
mit ‘realpath()’ alle ‘../’,’./’ entfernen und prüfen ob das Verzeichnis existiert.
da ‘realpath()’ auch das aktuelle Verzeichnis ausgibt nochmal Verzeichnis und Datei auf Existenz prüfen.
WP-load.php laden.