Monat: Dezember 2011

Windows 7, Apache, Port 80 belegt durch „System“

29. Dezember 2011 - Windows

Wenn der vor ein paar Tagen frisch installierte Apache Webserver auf dem neuen PC mit Windows 7 plötzlich nicht mehr funktioniert, schaut man mal schnell ins Internet und verbringt dann einen halben Arbeitstag mit Suchen und Ausprobieren. Irgend ein fremder Prozeß hat sich den Port 80 geschnappt, was zur Folge hat, dass der Apache nur noch eine kurze Fehlermeldung ausgibt und dann den Dienst einstellt. Bei den meisten Lösungen wird auf Skype oder auf die Microsoft Internet Information Services als Verursacher getippt. Man kann aber auch nachschauen, wer da auf dem Port sitzt mit "netstat -aon" und dann z.B. die vorgefundene Prozeß-ID im Taskmanager sucht. In meinem Fall war es mit der Prozeß-ID 4 das "System: NT Kernel & System" Jetzt kann man sehr viel herumprobieren, einzelne Dienste in der Systemsteuerung deaktivieren, alle Dienste, die das HTTP Protokoll benutzen, deaktivieren, usw. Geholfen hat das aber bei mir nicht. Das einzige Mittel war, den Apache selbst als Dienst zu betreiben. Dann hat offenbar "System" das Nachsehen. Also: Apache als Dienst eingetragen, Neuboot, Apache läuft. Jetzt Apache als Dienst deaktivieren, Neuboot, Apache läuft nicht mehr...

SuperBGImage-lite

22. Dezember 2011 - JavaScript, wordpress

Wenn Ihr browserfüllende Hintergrundbilder im Stil von SuperBGImage ( Autor: Andreas Eberhard) einsetzen wollt, aber die Diashow nicht benötigt: hier findet Ihr ein winziges Script, ein WordPress-Plugin und eine Demoseite dafür English Summary for "SuperBGImage-lite": If you need full-screen images on your website in SuperBGImage-style but without the overhead of the slideshow, here is a small-footprint script, an optional wordpress plugin and a demo page. WordPress User:
  1. Website vorbereiten: Wir brauchen einen  action hook 'body'  im Header direkt nach dem <body> tag;
    <body>
    <?php do_action('body'); ?>
    
    Wenn ihr schon einen action hook habt (z.B. beim xtreme Framework) könnt ihr diesen verwenden und müsst dann nur im php File des Scripts die Zeile 12 anpassen.
  2. Das Tag, mit dem euer Content beginnt, muss modifiziert werden, damit der Content über dem Bild schwebt:
    <body>
    <?php do_action('body'); ?>
    <div id="content>
    ...
    
    vorher kann es z.B. so aussehen
    <body>
    <?php do_action('body'); ?>
    <div id="content" style="position: relative;z-index: 3;">
    ...
    
    nachher dann so
  3. Legt eure Bilder in das image Verzeichnis vom Plugin. Wenn mehrere Bilder vorhanden sind, wählt das Plugin eines davon zufällig aus.
Non WordPress User Download  plugin, unzip und Bild und den js Code (start_BGimage.js) so in eure Seite integrieren, wie es der Codeview der Demopage anzeigt Die Demo page ist hier Download plugin SuperBGImage-lite

Tipp für ajax im Frontend

7. Dezember 2011 - wordpress

Bei meinen Tests mit ajax im Frontend ist mir eines aufgefallen: Ich hatte versucht, mein JS Script und das Registrieren des ajax_nopriv Hooks von den Admin-Pages fernzuhalten und in meinem Plugin folgendes notiert:

 


function ...() {
if (is_admin() === false ) {
add_action('wp_enqueue_scripts', array ('...','my_scripts'));
add_action('wp_ajax_nopriv_...', array ('...','...'),7);
}
}

Das führt aber dazu, dass der ajax Request nicht ausgeführt werden kann und eine -1 zurück liefert. So ging es dann ohne Probleme:

function ...() {
add_action('wp_enqueue_scripts', array ('...','my_scripts'));
add_action('wp_ajax_nopriv_...', array ('...','...'),7);
}

Nach wie vor muss man sich ausloggen, wenn man sein Plugin austesten will, da es sonst nicht funktioniert und eine 0 zurück liefert.
English Summary for "Tipp für ajax im Frontend":
Don't try to exclude your  add_action('wp_ajax_nopriv_...', array ('...','...'),7); from admin pages. Otherwise your ajax nopriv request will return a -1.

WordPress: add_action richtig deklarieren

2. Dezember 2011 - wordpress

Die Angaben in add_action müssen nach den php callback Konventionen  (Klassenname, Methode) erstellt werden. Z.B

class abc {

function abc() {
add_action('wp_enqueue_scripts', array ('abc','my_scripts'),6);
}
function my_scripts() {

....

Oft  wird  aber auch in der Literatur folgendes vorgeschlagen
class abc {

function abc() {
add_action('wp_enqueue_scripts', array (&$this,'my_scripts'),6);
}
function my_scripts() {

....
Der kleine Unterschied ist:  &$this trägt nicht nur den benötigten Klassennamen sondern auch den  gesamten Code der Klasse ein. Hier sieht man den Unterschied im array wp_filters Fall1:

results of wp_filter:

Array
 (
 [5] => Array
 (
 [abccb123] => Array
 (
 [function] => Array
 (
 [0] => abc
 [1] => cb123
 )

[accepted_args] => 1
 )

)

)

Fall2:

results of wp_filter:
 Array
 (
 [5] => Array
 (
 [000000003079115c0000000037d96f3dcb123] => Array
 (
 [function] => Array
 (
 [0] => abc Object ......
 (
 )

[1] => cb123
 )

[accepted_args] => 1
 )

)

)

WordPress bekommt es (meistens?) offensichtlich immer noch hin, trotzdem einen gültigen Eintrag in wp_filters zu erzeugen, aber der Rechenaufwand z.B. für die Erzeugung der ID ("abccb123" gegenüber "000000003079115c0000000037d96f3dcb123" ist ungleich größer Wenn man auf der sicheren Seite stehen will, sollte man also auf  &$this in add_action verzichten.

Download: Testplugin für ajax Frontend (nopriv) Request in WordPress

2. Dezember 2011 - JavaScript, wordpress

Weil zur Zeit einige Verwirrung herrscht, was in WordPress  mit ajax im Frontend möglich ist, habe ich ein kleines Plugin geschrieben, das ihr hier runterladen, installieren und austesten könnt. English Summary for "Download: Testplugin für ajax Frontend (nopriv) Request in WordPress": This is a small WordPress Plugin to demonstrate the use of ajax on the viewer side. You are free to download and test it or use it as a basis for your own implementations. Because WordPress  doesn't support viewer- or front-side ajax with user-logged-in: logout from the dashboard, otherwise you get a "0" result in the alert box. Das Plugin besteht nur aus zwei Dateien: 1. der ajax_test.php

if ( !class_exists('abc') ) {

class abc {

function abc() {
add_action('wp_enqueue_scripts', array ('abc','my_scripts'),6);
add_action('wp_ajax_nopriv_cb123', array ('abc','cb123'),5);
}
function my_scripts() {
wp_register_script('xyz', plugins_url().'/ajax_test/js/ajaxtest.js', array('jquery'),false,true);
wp_enqueue_script('xyz');
wp_localize_script('xyz', 'ajaxdata', array( 'ajaxurl' => admin_url( 'admin-ajax.php'),'akt_nonce' => wp_create_nonce('foo'),'action' => 'cb123' ));
}
function cb123() {
global $wp_filter;
check_ajax_referer('foo');
echo "results of wp_filter: \n";
print_r ($wp_filter['wp_ajax_nopriv_cb123']);
echo "\nresults of has_action (prio): ".has_action('wp_ajax_nopriv_cb123', array ('abc','cb123'))."\n";
die();
}
} // End Class
$abc = new abc();
}

Der Name der Klasse ist 'abc', die Methode, die von ajax aufgerufen wird ist 'cb123'. In cb123 wird über print_r der Teil des arrays wp_filter angezeigt, der von add_action('wp_ajax_nopriv_cb123',... in WordPress registriert wird. Danach wird das Ergebnis von has_action(...) angezeigt. Den Rückgabewert der Funktion has_action() kann man auch ganz gut zum Testen verwenden um zu kontrollieren,  ob die Action richtig registriert wurde. Hier seht ihr in der alertbox z.B.  die Priorität (5) und die Komponenten für den Callback , also die Klasse und die Methode. 2. ajaxtest.js

jQuery(document).ready(
function()
{
var data = {
action: ajaxdata.action,
_ajax_nonce: ajaxdata.akt_nonce
};
alert("ajaxtest");
var sendimage=jQuery.Deferred();
var mytimer=setTimeout(loadImage,1000);

function loadImage() {
alert('Hi : '+ ajaxdata.ajaxurl + ' ' + ajaxdata.action);
sendimage=jQuery.post(ajaxdata.ajaxurl,data);
jQuery.when (sendimage)
.then (
function (response) {
alert(response);

},
function (response) {
alert("error :"+ response);
}
);
}
})
Hier ist noch ein kleiner Timer eingebaut, der aber nicht wichtig für das Ergebnis ist. ajaxtest.js verwendet das promise() Interface von jQuery, was die Programmierung nach meiner Ansicht deutlich vereinfacht. Achtet darauf, dass ihr beim Testen nicht als Benutzer eingeloggt seid, weil WordPress  keine Front-End ajax requests mit eingeloggten Usern unterstützt. Der response ist dann schlicht '0'. Warum? Man weiss es nicht... Plugin ajax_test zum Downloaden ajax_test