Archiv für den Autor: Daniel Hüsken

iPhone sync ohne Google Sync

Ich habe gestern hier, gelesen das bei Google Sync (Active Sync. mit Gmail), zum 30.01.2013 für neue Nutzer abgeschaltet wird und dann nur noch mit den kostenpflichtigen Accounts möglich ist.

Deshalb habe ich mir mal angesehen (obwohl ich nicht betroffen sein sollte), wie ich weiterhin mein iPhone/iPad Synchronismen kann.

Dabei musste ich feststellen das es eigentlich ganz einfach einzurichten ist und sogar einige Probleme behebt.

Zum Synchronisieren von Mail, Kalender und Notizen (ging mir Goggle Sync nicht) bedarf es nichts weiter als beim Hinzufügen eines Accounts, Gmail auszuwählen und seine Login Daten zu hinterlegen. Einziger nachteil den ich bisher gefunden habe ist das die Gmail Adresse auch gleichzeitig die Absenderadresse ist. Die Synchronisation wird dann per IMAP mit dem Gmail Konto durchgeführt. Der Kalender wird per CalDAV synchronisiert und die Notizen landen im IMAP Ordner Notes. Den nachteil mit den Absenderadresse umgehe ich, indem ich die Gmail App installiert habe und diese zum mailen verwende. Die App nutzt auch die Signaturen die man in seinen Gmail Konto eingerichtet hat und mann kann mit den lieb gewonnen Labels vernünftig arbeiten. Dadurch das ich jetzt beides eingerichtet habe kann ich zur not auch noch direkt aus einer anderen App eine Mail verschicken. Ein weiter vorteil ist das man direkt alle seine Google Kalender zur Verfügung hat und diese nicht erst über eine extra Internetseite freischalten muss.Den Geburtstagskalender vom Google Kalender habe ich allerdings abgewählt da ich nicht alle Geburtstage doppelt haben wollte.

Die Kontakte Synchronisation muss mann, ich denke zur Zeit noch, extra  einrichten. Dazu richtet man ein zusätzlichen Account für CardDAV ein. Der Server Name ist google.com, plus die Google Account Daten. Damit geht dann auch die Synchronisation der Kontakte. Im Moment sieht es so aus als würde das auch besser funktionieren als mit Google Sync (Active Snyc.) zumindest scheint es so, das sich die Felder in den Adressen nicht mehr wahrlos umbenennen und ich hoffe das Geburtstage sich nicht mehr verschieben.

Alles im allen scheint es keinen nachteil durch das “abschalten” von Google Sync zu geben und man braucht auch keine extra Sync. Software zu installieren.

iPhone Google Sync einrichten

Mal wieder einier der dinge dich öfter wiedersuche. Wie richte ich mein iPhone mit Google Sync. (Exchange Aktive Sync.) ein.

Das wird auf der Seite http://support.google.com/mail/bin/answer.py?hl=de&answer=138740&topic=21161&ctx=topic sehr gut beschrieben.

Was aber wichtig zu wissen ist das mann auch Mehrer Kalender Synchronisieren kann und auch einstellen kann welche die Standard Absender Adresse ist. Wo mann das Macht ist hier beschrieben: http://support.google.com/mobile/bin/answer.py?hl=en&answer=139206
Wichtig ist dabei die Sprache auf Englisch (US) umzustellen.

Die Punkte im Einzelnen:

  • ‘Enable “Send Mail As” for this device’. Beutet das der Standard Absender aus dem Gmail Account genommen wird.
  • ‘Enable “Delete Email As Trash” for this device’. Bedeutet das wenn man Mails löscht diese nicht Archiviert werden sonder wirklich gelöscht werden (im Papierkorb landen).
  • Dann kann man noch einstellen welche Kalender man alle Synchronisieren möchte.

 

WordPress Links Menü Walker

Hier eine kleine Walker Klasse für WordPress um sich ein Menü in der Form ” Link1 | Link2 | Link3 ” zu erstellen.

Einfach die Klasse in die functions.php des Themes und den Menü Eintrag dort im Template platzieren wo er hin soll.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

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.

Internet vor 20 Jahren

Da bin ich auch ungefähr angefangen mit dem Interdingsda….

Mit einem 28k Modem und einem Anbieter der 80 DM im Monat dafür bekommen hatte das man einen Zugriffspunkt hatte. Seine Telefonkosten musste man natürlich noch oben drauf Zahlen. Der Anbieter selber hatte damals selber nicht mehr wie eine 256k Standleitung……

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 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.

WordPress 3.3 add_contextual_help deprecated

Eine einfache Möglichkeit festzustellen ob man mit “add_contextual_help()” oder “get_current_screen()->add_help_tab” arbeiten muss um die abwärts Kompatibilität zu behalten.


if (method_exists(get_current_screen(),'add_help_tab')) {
get_current_screen()->add_help_tab( array(
'id' => 'plugininfo',
'title' => 'Plugin Info',
'content' => '

Text

') );
} elseif (function_exists('add_contextual_help')) {
add_contextual_help( get_current_screen(), '

Text

');
}