[PHP] NextGEN Gallery – Sortierung der Galerien – Teil 2

Hallo,

ich hatte ja schon mal darüber geschrieben wie man die Bilder einer NextGen Galerie sortieren kann. Damals musste man sich noch durch den Code hangeln und ihn ändern… und beim nächsten Update war alles wieder futsch.

Jetzt habe ich vor ein paar Tagen eine elegantere Lösung gefunden. Die Galerie unterstützt nämlich die Zusammenarbeit mit benutzerdefinierten Feldern. Leider ist diese Information nicht einfach zu finden.

Aber um was geht es überhaupt genau?

Ich habe zum Beispiel meine Alben in den Galerien rückwärts Sortiert. Damit der Besucher immer oben die neusten Bilder sieht. Das macht Sinn, denke ich.
Nun erstellen wir einen Artikel und möchten dort auch ein Album einfügen. Weil man gerade etwas tolles Besucht hat und zig Fotos davon gemacht hat und man ein eigenes Album dafür angelegt hat.
Hier ist die Rückwärtssortierung jedoch Mist. Denn der Besucher soll ja in chronologischer Reihenfolge die Bilder sehen.

Leider kann man nicht für jedes Album die Reihenfolge einstellen. Also muss es anders gelöst werden. Und dafür gibt es eine Hilfe des Herstellers. Die benutzerdefinierten Felder.
Diese findet man unter dem eigentlichen Editor und sie heißen “Benutzerdefinierte Felder”… logisch :)

Dort trägt man Stück für Stück die Sachen ein die man braucht. Hier erst einmal eine Liste mit den möglichen Einstellmöglichkeiten.

Für das Erscheinungsbild der Nextgen-Gallery stehen folgende Befehle zur Verfügung.

Feldbezeichnung mögliche Werte
ngg_gal_ShowOrder gallery : Zeigt zuerst die Gallerie
slide : Zeigt zuerst die Slideshow
ngg_gal_Images 0-xxx : (Nummer) Anzahl von Bildern pro Seite
ngg_gal_Sort “pid” : Sortiert die Vorschaubilder nach ID
“filename” : Sortiert die Vorschaubilder nach Dateiname
“alttext” : Sortiert die Vorschaubilder nach dem ALT oder TITEL Text
ngg_gal_SortDirection “ASC” : Aufsteigende Sortierung
“DESC” : Absteigende Sortierung
ngg_gal_ShowSlide 0 : (Off) Kein Slideshow Link
1 : (On) Zeigt Slideshow Link
ngg_gal_ImgageBrowser 0 : (Off) Zeigt die Bilder direkt
1 : (On) Zeigt den Bildbrowser

Und für das Erscheinungsbild der Nextgen-Slideshow die folgenden:

ngg_ir_Audio “url”: (URL) Spielt eine Musikdatei
ngg_ir_Overstretch none : Behält Original-Dimensionen
fit : Bilder unverhältnismäßig vergrößern
true : Bilder verhältnismäßig vergrößern
ngg_ir_Transition Setzt den Übergangseffekt zwischen den Bildern:
fade, bgfade, blocks, bubbles, circles, flash, fluids, lines, random, slowfade
ngg_ir_Backcolor 0xHXHXHX : (z.B. 000FFF)
Hintergrundfarbe der Steuerung, im HEX Format.
ngg_ir_Frontcolor 0xHXHXHX : (z.B. 000FFF)
Text und Button Farbe der Steuerung, im HEX Format.
ngg_ir_Lightcolor 0xHXHXHX : (z.B. 000FFF)
Überlappende Farbe der Steuerung, im HEX Format.
ngg_ir_Width 0-xxx : (Zahl) Breite der Slideshow
ngg_ir_Height 0-xxx : (Zahl) Höhe der Slideshow
ngg_ir_Rotatetime 0-xxx : (Zahl) Zeit die ein Bild stehen bleibt
ngg_ir_Shuffle 0 : (Off) Anzeige der Bilder in Reihenfolge
1 : (On) Zufälliges Bild anzeigen
ngg_ir_ShowNavigation 0 : (Off) Navigation deaktivieren
1 : (On) Navigation aktivieren
ngg_ir_ShowWatermark 0 : (Off) Kein Wasserzeichen (Logo)
1 : (On) Wasserzeichen (Logo) wird angezeigt
ngg_ir_Kenburns 0 : (Off) Ken burns Effekt aktivieren
1 : (On) Ken burns Effekt deaktivieren

In unserem Fall würden wir nun das benutzerdefinierte Feld “ngg_gal_SortDirection” mit dem Wert “ASC” anlegen. Und schon wäre das Album in diesem Post aufsteigend sortiert.

Man könnte auch mehrere Befehle miteinander kombinieren (mehrere benutzerdefinierte Felder ausfüllen). So wie man es braucht.

Ich hoffe das konnte euch (und mir) helfen. :)

Viele Grüße
Gordon

[WordPress] Kommentarlinks einfach mit external, (no)follow und target=_blank

Hallo,

heute mal wieder einen Tipp zu WordPress.

Es ist hart umstritten… Kommentarlinks mit external oder ohne, follow oder nofollow und welchen target soll der Link haben. Die einen sagen Hü, die anderen Hot. Egal, jeder soll machen wie er mag. Doch wie macht man wie man mag?

Eigentlich ganz einfach. Zumindest wenn man alle Kommentarlinks gleich haben will. Also zum Beispiel sollte rel=”external” immer drin stehen, denn schließlich sind die Kommentarlinks external, es sei denn man selbst Kommentiert.

Dazu ruft man einfach seine “functions.php” in einem Editor auf und fügt am Ende, vor “?>” den folgenden Code ein. Natürlich dabei den Linkcode so bearbeiten wie man es mag.

// Kommentarlinks in neuem Tab / Fenster
    function comment_author_link_window() {
	    global $comment;
	    $url = get_comment_author_url();
	    $author = get_comment_author();
	
	    if ( empty( $url ) || 'http://' == $url) {
	    	$return = $author;
    	}
    	elseif(stristr($url, get_home_url())) {
	    	$return = "<a href='".$url."'>".$author."</a>";
    	} else {
	    	$return = "<a href='".$url."' rel='external nofollow' target='_blank'>".$author."</a>";
    	}
	    return $return;
    }
    add_filter('get_comment_author_link', 'comment_author_link_window');

Und schon werden alle Kommentarlinks mit den Attributen versehen die man haben möchte.

Ich persönlich habe alles gesperrt. Also rel=”external nofollow” und auch target=_blank. Viele werden jetzt denken “Was für nen Arsch.”. Aber externe Links sind nunmal “external”. Bei den Kommentaren die ich hier bekomme weiß ich manchmal nicht mehr ob es nur zum Abgreifen eines Links ist oder nicht. Daher “nofollow” und gut. Wer einen Kommentar schreibt, der tut es weil er etwas zu meinem Artikel beitragen möchte und nicht damit seine Seite besser rankt. Und external… ich mag meine Leser und möchte bitte auch das Sie auf meiner Seite bleiben! Finish :)

Bug in WordPress XMLRPC wp.uploadfile – Dateiupload funktioniert nicht!

Gerade habe ich einen Bug in der XMLRPC-Schnittstelle von WordPress gefunden. Anscheinen nutzt diese Funktion aber wohl kaum jemand, wenn es noch keinem Aufgefallen ist. Ich habe aber genau diese Klasse kopiert und in einem anderen Projekt verwendet, um es mir mal einfacher zu machen. :-)

Der Bug befindet sich in der wp.uploadFile aka mw_newMediaObject Funktion. Mit dieser Funktion können Dateien über die XMLRPC-Schnittstelle in den Blog geladen werden.
Das Problem, es funktioniert nur nicht wirklich. Die Daten müssen per base64_encode codiert werden. Hab ich auch brav gemacht, nur werden sie im Blog nicht wieder decodiert und damit genau so gespeichert wie sie übertragen werden. Das kann jedoch nicht funktionieren.

Also habe ich mich auf die Suche gemacht und den Fehler gefunden. Die XMLRPC Klasse von WordPress (class-IXR.php) erkennt auf der Client-Seite Base64-Codierte Strings nicht. Ich habe im Netz auch keine Möglichkeit gefunden wie man prüfen kann ob ein String im Base64-Format vorliegt. Daher habe ich zu einer anderen Möglichkeit gegriffen den Bug zu fixen.

Wir gehen mal wieder in den Code. Achtung: Wenn diese Änderung im Blog selbst vorgenommen wird, wird es beim nächsten Update überschrieben!
Als erstes nehmen wir uns ca. Zeile 35 vor. Hier sollte folgendes stehen:

foreach ($this->data as $key => $value) {
     $this->data[$key] = new IXR_Value($value);
}

Das ändern wir in:

foreach ($this->data as $key => $value) {
     if($key == "bits") $this->data[$key] = new IXR_Value($value, "base64");
     else $this->data[$key] = new IXR_Value($value);
}

Soweit ich gesehen habe gibt es den “bits” Parameter nur ein mal in der Schnittstelle. Und zwar genau dort wo der Base64-String unserer Datei drin ist. Also sagen wir “Wenn Parameter ‚bits’ ist, dann ist es Base64. Und schon schalten wir die automatische – und falsche – Erkennung des Variablen-Types aus und sagen gleich das es Base64 ist.

Dann gehen wir noch zu einem anderen Bug. Der ist ca. in Zeile 114. Die Originalzeile heißt:

case 'date':
     case 'base64':
          return $this->data->getXml();
          break;

Das gibt einen Fehler. Die Funktion getXml() gibt es unter $this->data nicht und wäre auch Schwachsinn.  Die Zeilen müssen wie folgt aussehen:

case 'date':
          return $this->data->getXml();
          break;
     case 'base64':
          return '<base64>'.$this->data.'</base64>';
          break;

So, jetzt sollte es funktionieren.

Wie gesagt, wenn ihr die Klasse kopiert habt und in einem anderen Projekt verwendet, dann ist es ok. Wenn ihr es im WordPress selbst ändert dann wird es beim nächsten Update überschrieben.

[WordPress] FTP Daten für automatische Updates festlesen

Da wir heute gerade schon mal beim Thema waren. Hier gleich noch ein Beitrag zu den automatischen Updates. Normalerweise fragt WordPress immer nach den FTP Daten um die Updates zu installieren. Man kann diese jedoch auch in der wp-config.php selbst (und fest) vorgeben. Dann müssen sie einerseits nicht mehr ständig eingegeben werden und es verringert auch das Sicherheitsrisiko (sagen jedenfalls die Experten :-) ).

Also wp-config.php öffnen und irgendwo – am besten nach den SQL Daten – die folgenden Parameter eintragen (und konfigurieren natürlich).

define('FTP_HOST', 'musterdomain.de');
define('FTP_USER', 'ftp_user');
define('FTP_PASS', 'ftp_paswort');

Die folgenden Zeilen müssen nicht angegeben werden. Wenn Du weißt was Du tust, dann kannst Du auch hier eigene Einstellungen vornehmen.

define('FTP_SSL', true); //SSL Verschlüsselter Upload
define('FTP_BASE', '...'); //Root Verzeichnis der WordPress Installation
define('FTP_CONTENT_DIR', '...'); //wp-content Verzeichnis
define('FTP_PLUGIN_DIR', '...'); //wp-plugin Verzeichnis
define('FS_METHOD', 'direct'); //FTP Methode

[WordPress] Automatisches Update funktioniert nicht

Ich habe schon seid einer Weile ein Problem mit meinen automatischen Updates im WordPress. Er bricht das Update gleich mit der Fehlermeldung: “Das Verzeichnis “wp-content” konnte nicht gefunden werden.” ab.

Dazu muss ich sagen das ich auf einen Webspace umgezogen bin und nun alles irgendwie in einem Root Verzeichnis, in verschiedenen Unterverzeichnissen, liegt. Das ganze wird über einen FTP Zugang gemanaged.

Schnelle Abhilfe schafft man sich indem man WordPress einfach den richtigen Pfad vorgibt. Dann weiß WordPress wieder wohin mit den Daten und alles ist schick ;-)
Dazu einfach den folgenden Code in die wp-config.php einfügen, irgendwo.

putenv('TMPDIR=' . ini_get('upload_tmp_dir'));

Speichern, hochladen und alles sollte wieder laufen.

1und1, WordPress Blogs und der 500 Internal server error

Hallo,

da hatte ich doch gerade mal wieder ein Problem. Kommt ja ab und zu mal vor :-) Und wie es scheint habe ich den nicht alleine. Es gibt schon einige User mit dem Problemchen.

Ich wollte auf einem 1und1 Webspace einen WordPress Blog installieren (V. 3.0.01) und bekam probt einen “500 Internal Server Error”.

Die Lösung ist einfach, aber normalerweise kommt man darauf selbst nur schwer, da er absolut unnatürlich ist :-)

Den folgenden Code in die .htaccess einfügen und der Blog sollte laufen.

AddType x-mapp-php5 .php
AddHandler x-mapp-php5 .php

[WordPress] HTML-Dateiendung in Artikeln, Seiten, Tags und Kategorien

Hallo zusammen,

ich spiele ja in der letzten zeit auch endlich mal ein bisschen mit SEO rum und überhaupt hat es mich schon eine weile gestört das in wordpress keine vernünftigen dateiendungen integriert sind. Google mag es mit sicherheit nicht wenn eine url auf “…/category/fun” endet… ohne slash ohne “.html” … ohne alles. Einfach zu ende.

Nun ist es sehr einfach bei wordpress an jeden artikel ein “.html” anzuhängen. Das kann man ganz einfach in den permalinks in den optionen einstellen. Möchte man das auch bei seiten und sogar bei den kategorien machen… hat man schon ein problem.
Und so habe ich mich auf die suche begeben und bin fündig geworden.

Ich bin über 10 ecken auf das plugin “.html on pages” aufmerksam geworden. Das ist erst einmal teilweise was ich suchte. Denn das dieses plugin fügt nur bei seiten die dateiendung “.html” hinzu… nicht bei kategorien. :-(

Also selbst ein bisschen rumgefummelt und siehe da… nun geht es auch bei den kategorien. :-) Da mein blog noch immer code nicht vernünftig darstellt habe ich das überarbeitete plugin einfach noch mal gezippt und du kannst es >hier< downloaden. Ich habe auch die readme.txt noch mal erweitert.

Nun gab es aber gleich noch ein problem. Mein blog besteht ja nun schon eine weile und es gibt schon so einige urls die auch bei google indexiert sind und verlinkungen zu anderen seiten. Also würden alle anfragen auf die alten urls auf der 404 seite landen. Das wäre natürlich nicht so toll.
Daher musste noch ein 301 redirect her. Der kommt in die .htaccess über die regeln von wordpress – logisch. Hier der htaccess code:

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1.html [L,R=301]

Damit werden alle seiten ohne .html und ohne slash (/) am ende mit der endung “.html” versehen. … Damit haben wir es … oder?

Nee, leider immer noch nicht. Ein kleiner fehler ist mir – bis jetzt – aufgefallen. Möchte ich meinen rss-feed abrufen… schickt er mich auf die 404-seite (seite nicht gefunden). Warum? Auch er bekommt ein “.html” angehängt… aber der feed kann damit nicht aufgerufen werden. Er funktioniert immer noch ohne. Also schnell noch ein eintrag in der .htaccess. Am besten ganz oben:

RewriteRule ^feed$ feed/ [L,R=301]

So, jetzt bekommt er ein slash und wird damit von der anderen regel ignoriert.

Nun haben wir es erst einmal. :-)
Bitte beachtet das eine änderung in den permalinks im adminmenü die .htaccess änderungen unter umständen wieder rausschmeißt.

—-

Ach gleich das nächste problem. Ok, durch die rewrite rule wird nun überall .html hinzugefügt. Das ist nicht immer schön. Ich habe noch die nextgen galerie installiert. Die arbeitet nun natürlich auch nicht mehr. :-( Denn auch sie kann mit den html-endungen nicht umgehen. Mist…
Also wer noch andere urls braucht der muss die htaccess regel modifizieren. Ich habe meine jetzt geändert zu:

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$
RewriteCond %{REQUEST_URI} !^/nggallery/[^\.]+[^/]$
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1.html [L,R=301]

Damit sage ich “nur wenn in der url nicht ‘nggallery/’ enthalten ist.

Ich hoffe es geht alles gut :-)

CU
Gordon

Update:
Da muss ich gleich noch mal ein Update hinterherschießen. Habe gerade festgestellt es gibt ja auch noch die Tags. :-) Habe das Plugin auch gleich noch mal modifiziert. Jetzt werden die urls für seiten, kategorien und tags unterstützt. Artikel urls kannst du ja selbst im administrationsbereich einstellen.

[WordPress] Geheime Einstellungsmöglichkeiten

Hallo zusammen,

gerade habe ich weder einmal etwas dazugelernt.

Ich wollte meinen RSS-Feed bei portalen eintragen und da meinte eines doch glatt das sie keine englischen feeds aufnehmen… :-o Wie, english? Wie kommen die denn darauf?
Ganz einfach, weil mein rss-feed auf english (en) steht.

Gut… wie ändere ich das jetzt? Alle einstellungsseiten durchgesehen… nix gefunden. Ich wollte schon wieder in den quellcode gehen als ich noch eine andere, höchst interessante, lösung fand. Es gibt nämlich bei wordpress eine einstellungsseite auf die man normalerweise nicht gelangt. Kein link im menü führt dorthin… eine geheime einstellungsseite quasi :-)

Wie kommt man nun dort hin. Erst einmal ins backend einloggen. Dann nach “wp-admin/” options.php eingeben. Also so das die url in etwa so aussieht: http://www.domain.de/wp-admin/options.php

Hier gibt es (zwischen den vielen anderen) die einstellmöglichkeit “rss-language”… hier muss man “de” eingeben. Und schon ist der rss-feed auch in deutsch.

Aber auf der seite gibt es noch zig andere einstellmöglichkeiten… in denne niemand rumfummeln sollte der nicht weiß was er tut… deswegen ist sie auch so gut versteckt ;-)

Viele Grüße
Gordon

[PHP] NextGEN Gallery – Sortierung der Galerien

Hallo zusammen,

mal wieder die NextGEN Gallery.
Da ich es leid bin nun ständig alle Bilder per Hand zu bearbeiten und hochzuladen habe ich die Flash-Upload entdeckt… nachdem ich die Galerie schon Monate benutze. :-) Ein schickes Tool wenn man richtig viele Bilder hochladen möchte. Das funktioniert auch super! Nur einen kleinen Schönheitsfehler gibt es… die Sortierung.

Denn lade ich ein Bild einzeln hoch… dann landet es als erstes in der entsprechenden Galerie. Richtig, so soll es ja auch sein. Ist ja das neuste Bild also muss es als erstes angezeigt werden. Lade ein ganzes Verzeichnis per Flash Upload hoch dann bedeutet es (bei mir jedenfalls) das ich z.B. einen Tagesausflug dokumentiert habe… und dann möchte ich das dass erste geschossene Bild (also das eigentlich älteste) auch an erster Stelle haben.

Gut, der Programmierer kann das nicht voraus ahnen… aber er könnte z.B. für jede Galerie eine eigene Sortierungsoption angeben ;-)

Ich habe es für meine Zwecke (mal wieder) direkt im Quellcode geändert. Keine schöne Lösung, aber selten :-)

Wenn Du das auch so machen möchtest (vorsicht, beim nächsten Update ist alles wieder beim alten)… dann mache folgendes:

Rufe die Datei /wp-content/plugins/nggallery/nggfunctions.php mit einem Editor auf. Gehe in die Zeile 249 (ungefähr). Hier werden die Bilder sortiert:

$ngg_options['galSortDir'] = ($ngg_options['galSortDir'] == “DESC”) ? “DESC” : “ASC”;

Ich habe es wie folgt gelöst. 2 verschiedene Alben. Eines mit Gallerien wo ich einzelne Bilder hochlade (aktuelle von mir oder so) und ein Album wo ich Galerien habe wo ich immer ganze Verzeichnisse hochlade. Du musst die ID’s der beiden Alben kennen. Hier nehme ich einfach 1 und 2 für das Beispiel.

Füge nun über der obigen Zeile den folgenden Code ein:

$album = get_query_var(‘album’);

Damit haben wir nun die ID des aktuellen Albums. Jetzt müssen wir wissen welche Sortierung für welches Album. Album 1 ist letzte zuerst, also ASC. Bei Album 2 DESC.

if($album == 1) $ngg_options['galSortDir'] = ($ngg_options['galSortDir'] == “DESC”) ? “ASC” : “DESC”;
else $ngg_options['galSortDir'] = ($ngg_options['galSortDir'] == “DESC”) ? “DESC” : “ASC”;

Nun kann es sein das es jetzt genau falsch sortiert ist. Je nachdem wie Du die globale Sortierung eingestellt hast. Dann einfach entweder die globale Sortierung ändern oder $album == 1 gegen $album == 2 tauschen.

Das wars. Aber wie gesagt, wenn Du das nächste Update machst… ist wahrscheinlich alles wieder weg.

Gruss
Gordon

Mein Blog twittert jetzt auch :-)

Tach zusammen,

ja ich weiß, ich bin spät dran mit twittern… aber wie sagt man so schön… besser spät als nie :-)

Für alle die nicht wissen was twittern ist… keine panik, ich weiß es auch nicht! Aber ich tue es jetzt einfach mal. :-P Nein, twitter ist irgendwie ne mischung aus social-irgendwas und rss. Man kann sich anmelden und fleißig statusmeldungen eingeben. Sowas wie bei facebook die “live-meldung” oder bei meinVZ der “buschfunk”. Mehr nicht… die seite besteht nur aus diesen kleinen nachrichten und die leute stehen drauf.. warum auch immer. Und ich mache jetzt mit :-) Aber nicht bei twitter direkt, nur mein blog schreibt fleißig diese meldungen von ganz allein (weniger arbeit für mich) ;-) Und das tolle… twitter schickts dann gleich an facebook weiter… so verpasst keiner mehr meinen schwachsinn :-D

Wer mir followen (folgen) will… bitte schnell adden: http://twitter.com/ChaosGordon

Das hier ist auch gleich soetwas wie eine feuerporbe für das twitter-plugin für wordpress… ich hoffe doch das es funktioniert!

soo, dann mal los!

Tschau
Gordon

Update: Nee, funktioniert nicht… mein PHP unterstützt kein json_decode()… verdammt :(

Neues Update: Jetzt gehts… hab nen kleinen patch gefunden:

if ( !function_exists(‘json_decode’) ){
function json_decode($json)
{
// Author: walidator.info 2009
$comment = false;
$out = ‘$x=’;

for ($i=0; $i<strlen($json); $i++)
{
if (!$comment)
{
if ($json[$i] == ‘{‘) $out .= ‘ array(‘;
else if ($json[$i] == ‘}’) $out .= ‘)’;
else if ($json[$i] == ‘:’) $out .= ‘=>’;
else $out .= $json[$i];
}
else $out .= $json[$i];
if ($json[$i] == ‘”‘) $comment = !$comment;
}
eval($out . ‘;’);
return $x;
}
}

PS: Und baut ein kleinen sleep(3) ein bevor die _aj_birdfeeder() verlassen wird… sicher ist sicher… hat beim ersten mal auch nicht funktioniert.

Update: Man, gar nicht so einfach…. jetzt hat es funktioniert aber kein link zum blog da :( Die Shorturl wird nicht angezeigt :(

Letztes Update: jetzt geht alles… etwas entscheidendes vergessen. Die obige fuhnktion macht kein objekt mer sondern ein array… daher muss die folgende zeile umgeschrieben werden:

$shortUrl = $shortnameHash->results->$postUrl->shortUrl;

in

$shortUrl = $shortnameHash["results"][$postUrl]["shortUrl"];

nu gehts. :-)