Schlagwort-Archiv: WordPress

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.

Ressourcen Sparen bei Ajax Calls in WordPress

Bei meiner arbeit am Plugin BackWPup habe ich nach einer Möglichkeit gesucht Ressourcen zu sparen bei Ajax Calls und bei der Auftrags Ausführung. Die einzeige große Einsparung die ich bisher gefunden habe ist es die Übersetzungen anderer Plugins nicht mit zu laden das die enorm viel Speicher verbrauchen. Dies bringt in meiner test Installation mit 20 Plugins eine Einsparung von 31 MB auf 25,5 MB Script speicher. Da die Dateien auch nicht geöffnet werden wird das auch noch eine Einsparung bringen die ich im Moment nicht beziffern kann.

Hier die Umsetzung:
Wichtig ist hierbei das ich nur die Übersetzungen nicht lade wenn es sich um Calls meines Plugins handelt.

define('PLUGIN_MENU_PAGES', 'page1,page2');
if (defined('DOING_AJAX') and DOING_AJAX and in_array($_POST['backwpupajaxpage'],explode(',',PLUGIN_MENU_PAGES)))
add_filter('override_load_textdomain', create_function('$default, $domain, $mofile','if ($domain=="textdomain") return $default; else return true;'),1,3);

Zusätzlich musste ich noch einbauen das mein Plugin als erstes geladen wird:

define('PLGUNINNAME_PLUGIN_BASENAME',plugin_basename(__FILE__));

public function pluginname_first_plugin($newvalue, $oldvalue) {
if (!is_array($newvalue))
return $newvalue;
for ($i=0; $i<count ($newvalue);$i++) {
if ($newvalue[$i]==PLGUNINNAME_PLUGIN_BASENAME)
unset($newvalue[$i]);
}
array_unshift($newvalue,PLGUNINNAME_PLUGIN_BASENAME);
return $newvalue;
}
add_filter('pre_update_option_active_plugins', 'pluginname_first_plugin',1,2);

Vielleicht kennt ja noch jemand eine Lösung die Ressourcen weiter zu optimieren und die WordPress eigene Ajax Behandlung zu nutzen...

Update:
mit einer etwas geänderten Funktion ist es nicht mehr notwendig das Plugin nach vorne zu schieben ;)

define('PLUGIN_MENU_PAGES', 'page1,page2');
function overide_textdomain($default, $domain, $mofile) {
if ( (defined( 'DOING_CRON' ) && DOING_CRON) && in_array($_POST['backwpupajaxpage'],explode(',',PLUGIN_MENU_PAGES))) {
global $l10n;
if ($domain=='owntextdomainname') {
foreach (array_keys($l10n) as $domainkey)
unset($l10n[$domainkey]);
} else {
return true;
}
}
return $default;
}
add_filter('override_load_textdomain','overide_textdomain');

Update: Ich glaub das best ist es wenn in WordPress der WP-Performance-Gettext-Patch integriert wird. Nach meinen Tests bring das am meisten. Der Speicher verbrauch geht dann auf ca 17MB runter.

Flatter Button in Bugis integrieren

Da mir die Falttr Buttens in dem Bugis Theme fehlten hab ich mir ein Child Theme gemacht und sie selber integriert.

Hier der Code damit Ihr nicht alles nochmal machen müsst:
in der functions.php

In der sharebtn.php

  • <input type='text' value='' onclick='this.focus(); this.select();' />
  • <g:plusone size="medium" href="">
  • <a href="http://twitter.com/share" class="twitter-share-button"
    data-url=""
    data-text=""
    data-count="horizontal">Tweet
  • <iframe src="http://www.facebook.com/plugins/like.php?href=ID)); ?>&layout=button_count&show_faces=false&width=450&action=like&colorscheme=light" scrolling="no" frameborder="0" allowTransparency="true">
  • name.', ';
    }
    }
    $tags=substr($tags,0,-2);
    ?>
    <a class="FlattrButton" style="display:none;" title="" data-flattr-button="compact" data-flattr-uid="danielhuesken" data-flattr-lang="" data-flattr-category="text" href="">


Nicht vergessen bei data-flattr-uid=”danielhuesken” die eigene user ID einzutragen.

Warum BackWPup von mir entwickelt wurde

Diese frage tauchte Heute in einem Kommentar eines Blog Beitrages über BackWPup von David Decker auf.

Also es wahr vor ca. etwas über einem Jahr da wahr ich auf der suche nach eine Backup Lösung für meinen Blog.

Diese sollte volgendes können:

  • Datei Backup
  • Datenbank Backup
  • die Backup Datei transferieren (FTP, Mail,…)

Außerdem wollte ich ab und zu ganz gerne mal ein automatisches Optimize der Datenbank durchführen.

Weiterlesen

BackWPup 2.0 ist fertig zum testen

Es ist endlich soweit ich habe die 2.0 Version von BackWPup soweit fertig.

Neuerungen sind:

  • Backend Interface überarbeitet, jetzt noch mehr im WordPress Stiel, mehr Ayax/JQuery integriert.
  • Komplet überarbeitete Job Abarbeitung:
    • Läuft jetzt nicht mehr im WordPress Kontext sondern im eigenen
    • Abgebrochene Jobs werden automatisch weiter geführt
    • Braucht nur noch sehr wenig Script Speicher
    • die Ausführungszeit des Jobs wird automatisch erhöht wenn möglich (max_execution_time)
    • der Fortschritt wird zurückgegeben
    • u.v.m.
  • Google Storage wird jetzt unterstützt
  • das System Temp Verzeichnis wird genutzt und nicht mehr eins innerhalb des Blogs
  • Neue minimal Voraussetzungen:
    • WordPress 3.2 und damit verbundene PHP,Mysql Version
    • PHP Sessions
    • PHP Curl
  • läuft jetzt auch im Debug Modus ohne Fehlermeldungen
  • jede menge Bug fixes…… und vielleicht ein paar neue ;)
  • u.v.m.

Herunterladen könnt Ihr euch die Version bei WordPress.org, es ist die Development Version.

Auf Resonanz von Testern würde ich mich sehr freuen um die letzten Probleme vor dem Release mit WordPress 3.2 beseitigen zu können.

Ein Herzlich Dankeschön geht schon mal an David Decker der die deutsche Übersetzung gemacht hat und auch ein paar Beta Tests.

BackWPup: Sicherung für deinen WP Plog

Ich habe ein neues Plugin für WordPress geschrieben mit dem mann die Datenbank und die Dateien von WordPress sichern kann das Plugin heißt “BackWPup” und steht ab sofort in der Version 0.5.0 zur Verfügung. Ich habe das Plugin ins leben gerufen weil ich auf der WordPress Homepage nur ein Plugin gefunden habe was dieses unterstützt. Dieses Plugin wird aber zur Zeit nicht mehr weiter entwickelt. Ich habe auߟderdem meinem Plugin eine Funktion zur automatischen Optimierung der Datenbank hinzugefügt damit ich hierfür kein zusätzliches mehr brauche. Mein Plugin nutzt das in WordPress enthaltene PCLzip zum komprimieren der Sicherung.

Wer will kann das Plugin gerne mal Downloaden und testen. Die aktuelle Version ist zwar noch in der Entwicklung aber soweit ich testen konnte läuft es jetzt schon sehr gut.

Für Anregungen und Verbesserungen bin ich gerne zu haben.