[Update]Steve: jetzt mit Bildvergleich – WordPress Management für Profis

Die Aufgabe: WordPress Updates

WordPress Core Updates verlaufen in aller Regel ohne Probleme. Bei Plugin- oder Theme-Updates sieht die Sache schon ganz anders aus. Die Ursachen können sehr unterschiedlich sein: Bugs in dem Plugin selbst, Kompatibilität zu anderen Plugins... Die möglichen Auswirkungen der Fehler sind auch höchst unterschiedlich, in manchen Fällen ist es die komplette Homepage, die nicht mehr angezeigt wird oder PHP-Fehlermeldungen, die mitten auf der Seite zu sehen sind. Oftmals sind es eher kleine Veränderungen, dennoch unerwünschte.

 

Screenshots nach einem Update vergleichen

Mit dem Vergleich "davor und danach" von automatischen Bildschirmfotos der Website, können auch kleine Fehler entdeckt werden. Das System sucht nämlich automatisiert nach Veränderungen und gibt die Anzahl gefundener Unterschiede (in %) an.

So lassen sich Fehler auch viel später erkennen (Steve behält die Historie der Updates und die entsprechenden Screenshots) und ermöglicht, wenn notwendig, das Einspielen des richtigen Backups - standardmäßig wird bei jedem Update-Vorgang, das kann ein einzelnes oder mehrere Updates direkt hintereinanderer, ein Backup erstellt.

Die Zukunft: Auto Backup Restore, Auto Plugin Tagging uvm

Als nächstes ist geplant, die SLA-Funktionalität für unsere WordPress-Kunden auszubauen:

  • Kunden können nach Updates eine Mail mit einem Link zu dem Screenshot-Vergleich erhalten, um selbst zu prüfen, dass alles in Ordnung ist
  • Kunden können angeben, dass die Prüfung in Ordnung war, oder Fehler beinhaltet; daraufhin werden Meldungen an Steve übergeben, um die Updates ggf. rückgängig zu machen und ggf. die Plugins (in der vorhandenen Version) als "broken" zu taggen.
  • Wenn das automatisierte Staging integriert sein wird, kann dieser Prozess auch darauf abgebildet werden: erst nach Freigabe vom Kunden wird das Update auf die Live-Instanz durchgeführt

Steve: das neue WordPress Management Tool für SaaS Web

Nach mehreren Monaten Entwicklungszeit ist Steve nun in Produktion gegangen. Steve steht für Perfektion: eine Hommage an Steve Jobs und ein Lob an den Core-Entwickler und SaaS Web Geschäftsführer Daniel Jagszent. Steve steht aber auch für Gleichberechtigung zwischen Frau und Mann: nachdem “intelligente Bots” nach Frauen benannt wurden (Siri, Alexa, Cortana), haben wir uns entschieden unser Tool nach einem Mann zu benennen!

Mit Steve ersetzen wir InfiniteWP

InfiniteWP (IWP) ist eine populäre PHP/MySQL Webanwendung um (zahlreiche) WordPress Websites zu verwalten – in der Basisversion kostenfrei, jedoch kann man für einen professionellen Einsatz nicht auf die kostenpflichtigen Add-Ons verzichten. IWP bietet durch seine Erweiterungen zahlreiche Funktionen, es kommen immer wieder neue dazu.
Trotz der umfangreichen Funktionalität waren wir mit der Anwendung nie ganz zufrieden:

  • Zum Einen waren Features, die für die Verwaltung von Business Sites wichtig sind (z. B. SLA für Update-Management oder Auto-Backups bei Updates) nicht verfügbar,
  • zum Anderen waren wir auch mit der Qualität der Software nicht zufrieden (viele Bugs, nicht fertig gedachte Features).

Professionelles WordPress Management mit Steve

Steve WordPress Management

Mit der neuen (Ruby on Rails) Anwendung ist das Management der WordPress Sites auf unsere Bedürfnisse zugeschnitten. Ein Auszug der Features:

  • Auto Discover der WordPress-Instanzen auf den Servern
  • Automatische “SaaS Web” MU-Plugin Installation für Kommunikation mit Steve
  • Automatische Backups bei Updates (ein/ausschaltbar)
  • Daily bzw. nightly Backups aller WordPress Instanzen; File-Backups sind inkrementell.
  • One Click Backup Restore
  • Individuelle SLA Integration: u. a. Updates für VIP Sites nur außerhalb Geschäftszeiten möglich – außer Sicherheitsupdates
  • Audit Funktion: Logging aller WordPress Aktionen
  • Unterstützung von WordPress Multisite

Ein Fokus auf die Usability

Steve ist nicht nur ein fleißiger Musterschüler. Steve ist auch eine ergonomische Software, um die tägliche Arbeit mit WordPress komfortabel und effizient zu verrichten.

Dazu gehört zum Beispiel:

  • Einfache Menüführung ohne komplizierte Verschachtelungen
  • Suchfeld für Websites mit Autocompletion
  • Actions-Quicklinks bei Website-Listeneintrag
  • Kommunikation zwischen Browser und Server mittels WebSocket für direkte Rückmeldung ohne Neuladen der Website

Ein Tool auch für die Zukunft

Schon in Planung, leider noch nicht verfügbar, ist das automatische Aufnehmen von ausgewählten Seiten (als Bild) vor und nach einem Update. So lassen sich manuell (ungewollte) Änderungen schneller erkennen und ggf. auch zeitlich einordnen, falls nicht sofort erkannt. Entsprechend kann das richtige Backup schneller wieder eingespielt werden.
Auch automatisches Staging steht an – aktuell ein manuelles Verfahren – und viele andere Features…

WordPress mit WP CLI einfach und schnell installieren

Dieses kurze Video-Tutorial zeigt wie man in wenigen Schritten, eine neue WordPress-Website installieren kann. Voraussetzung für die erfolgreiche Ausführung sind: ein SSH-Zugang, WP CLI und eine bereits eingerichtete Datenbank. Die Domain sollte auf dem Webserver auch bereits angelegt worden sein.

 

Weinblog Redesign Livegang

Endlich ist der französischsprachige Weinblog von François Potevin nach einigen Wochen harter Arbeit im neuen Look bzw. mit neuem “Unterbau” live gegangen. Zu den Neuerungen zählen:

  • HTML5
  • Responsive Layout
  • Bildoptimierungen (Kompression)
  • Einheitliche Struktur der Artikel und Excerpts
  • Kontextuelle Angebote in der Sidebar (aktuell nur für Desktop- und Tablettansicht)

vinsdumonde

Die neue Lindenbaum Homepage ist live

Nach langer Entwicklungs- und Finetuningszeit ist die neue Lindenbaum-Homepage heute live gegangen. Das Design stammt vom Hochquadrat-Mitglied Miss Koepke und die Entwicklung ist natürlich von uns. Nicht nur das Theme der WordPress Website war zu entwickeln, sondern auch intelligente Backend Einstellmöglichkeiten, damit das Lindenbaum-Team auch künftig selbständig Änderungen durchführen kann.

screenshot-lindenbaum

Relaunch Ferien-Karlsruhe

Kurz bevor die neuen Angebote in der Geschäftsstelle buchbar sein sollen, geht die Website mit einem überarbeiteten Design (Miss Koepke) und neuen Funktionen live. Neuerungen sind u. a. :

  • eine kompaktere Startseite mit einem neuen Logo
  • ein Suchfilter auf der Startseite
  • eine übersichtlichere Ansicht der Angebotseinzelseiten
  • die Möglichkeit mehrere Angebote gleichzeitig zu buchen und dabei verschiedenen Kindern direkt zuzuweisen
  • und einiges mehr.. 

Ferien Karlsruhe

TEDxESA Website für Online Registrierungen offen

TEDxESA

SaaS Web hat für das TEDx Event die Teilnehmer-Registrierung in die bestehende WordPress Event-Seite integriert. Das Projekt bestand darin ein Anmeldeformular anzuzeigen und die Möglichkeit zu geben, Anfragen zu sortieren sowie ausgewählten Teilnehmern per Rückmeldung zur Zahlung aufzufordern. Zudem wurde ein ermäßigter Zugang für Studenten angeboten.

Wordcamp in Köln war ein tolles Event

Es ist eigentlich noch nicht vorbei, heute ist Contributor Day. Dieser Tag wird den Personen gewidmet, die der (Weiter-)Entwicklung von WordPress beitragen – in allen möglichen Bereichen, es muss nicht unbedingt technischer Natur sein.

SaaS Web war nicht nur Sponsor des Events! Wir, Daniel Jagszent und Matthias Wulkow, waren auch vor Ort und haben an den zahlreichen Vorträgen teilgenommen. Am Sonntag wurde auch unter vielen anderen Geschenken ein WordPress Hosting L verschenkt.

Hier ein paar Eindrücke des Wordcamps:

David Jardin zum Thema CMS Garden

CMS Garden

Silvan Hagen zum Thema UX Design Prozess zur Plugin Entwicklung

Feedback Plugin

Elisabeth Hölzl zum Thema Barrierefreiheit bzw. Barrierefreundlichkeit

Barrierefreiheit

Jon Ziemlich zum Thema WordPress Security (und mit einem Live-Hack)

Wordpress Security

Dominik Schilling und Konstantin Obenland in der Fragen/Antworten Session

Fragen & Antworten

Luc Princen zum Thema Javascript Theme

js-theme-1

Torsten Landsiedel zum Thema Child Themes

child-themes-1

Homepage stammel.de online

stammel-logoBasierend auf das Theme Zonya hat Navispace ein individuelles Design für die Stammel-Modehäuser aus der Münchner Umgebung, genauer in Buchloe, Mindelheim und Schwabmünchen. SaaS Web hat die gewünschten Anpassungen umgesetzt und dabei die Theme-eigenen Mittel genutzt. Das Hosting der Website übernimmt SaaS Web ebenfalls.

WordPress: Stylesheets verändern oder ergänzen mit wp_enqueue_style und wp_dequeue_style

WordPress LogoWer schon mal mit WordPress gearbeitet hat, weiß, dass es durchaus passieren kann, dass hinzugefügte PlugIns eigene Styles mit sich bringen und daher ggf. angepasst werden müssen. Natürlich ist es keine besonders gut Idee, die Styles direkt in dem PlugIn zu ändern, denn beim nächsten Update, sind die Anpassungen weg. Auch lassen sich die Styles oft nicht mit der style.css aus dem Root-Verzeichnis überschreiben, da die PlugIn-Styles durchaus später geladen werden.

So geht’s: wp_enqueue_style / wp_dequeue_style

 


 


MBI Geodata Website Relaunch

mbi-geodata

Zu MBI-International: MB-International verfügt als Hersteller über ein weit reichendes Angebot an internationalen Markt- und Geodaten auf verschiedenen Gebietsebenen (Postalisch-, Administrativ-, Mikroebene). Hierzu zählen Soziodemographische Daten wie z.B. Bevölkerungszahlen, Anzahl Haushalte und die Alterstruktur sowie Kaufkraftdaten und die dazu passenden Gebietsgrenzen. Weltweite Straßendaten in unterschiedlichen Maßstäben und Qualitäten runden das Angebot ab.

Hier geht es zur Homepage.

OpenShift offiziell released und wird kommerziell vertrieben

openshift-logoDie populäre Platform as a Service Lösung von RedHat (ehemals Makara) ist nun offiziell aus dem Betastadium raus und wird neben dem kostenfreien gehosteten Package auch mit Premium Service kostenpflichtig angeboten.

Mit OpenShift lassen sich zahlreiche Plattformen einrichten wie z. B. für Java, Ruby, JavaScript (Node.js), PHP, Perl und Python. Über Cartridges lassen sich zudem auch eigene Anwendungen einbinden.

Git Flow – Professionelles Arbeiten mit Git

gitflow

Git ist bereits ein hervorragendes Versionierungssystem mit dem gerade verteilte Teams sehr gut zusammen arbeiten können.

Man kann der Torte allerdings noch eine Kirsche verpassen in dem man Git Flow nachrüstet und somit eine wirklich professionelle Umgebung schafft. Mit Git Flow lassen sich verschiedene Branches automatisiert erstellen und mit vorgegeben Regeln wieder mergen.

So geht’s (wenn git bereits installiert ist):

– Git Flow installieren
– Git Bash öffnen und in das Repo wechseln

Git Flow für ein Repo aktivieren:
git flow init

Von einem Branch zum anderen wechselt man einfach mit:
git checkout [branch-name]

Beispiele:

  • Hotfix-Branch starten:
    git flow hotfix start [hotfix-branch-name]
  • Hotfix-Branch beenden:
    git flow hotfix finish [hotfix-branch-name]

Hotfix-Branches werden automatisch mit den master- und staging/developer-Branches gemerged. Der Feature-Branch wird mit dem staging/developer-Branch gemerged. Um anschließend online zu gehen, muss der Umweg über den Release-Branch gemacht werden, der dann mit dem master-Branch gemerged wird.

WordPress: Wirklich individuelle Navigation erstellen und der Walker_Nav_Menu Klasse

Es kommt immer wieder vor, dass eine Website-Navigation, nicht nur den Seitennamen anzeigen soll, sondern auch Informationen, die dazu gehören, wie zum Beispiel die Description oder das Seiten-Bild, oder was auch immer… Um die Kontrolle darüber zu bekommen, braucht man die Walker_Nav_Menu Klasse.

Vorgehensweise
In der functions.php folgenden Code eingeben, es entspricht dem WP-eigenen Code. Dort werden anschließend die gewünschten Änderungen durchgeführt.

class Custom_Walker extends Walker_Nav_Menu{

  function start_el(&$output, $item, $depth, $args){

    $classes = empty ( $item->classes ) ? array () : (array) $item->classes;
    $class_names = join(” “, apply_filters(“nav_menu_css_class”, array_filter($classes), $item));

    ! empty ($class_names) and $class_names = ” class='” . esc_attr($class_names) . “‘”;

    $output .= $indent . “<li id=’menu-item-” . $item->ID . “‘” . $value . $class_names . “>”;

    $attributes = “”;

    ! empty($item->attr_title) and $attributes .= ” title='” . esc_attr($item->attr_title) . “‘”;
    ! empty($item->target) and $attributes .= ” target='” . esc_attr($item->target) . “‘”;
    ! empty($item->xfn) and $attributes .= ” rel='” . esc_attr($item->xfn) . “‘”;
    ! empty($item->url) and $attributes .= ” href='” . esc_attr($item->url) . “‘”;

    $title = apply_filters(“the_title”, $item->title, $item->ID);

    $item_output = $args->before . “<a $attributes>” . $args->link_before . $title . “$lt;/a> ” . $args->link_after. $args->after;

    // Since $output is called by reference we don’t need to return anything.
    $output .= apply_filters(“walker_nav_menu_start_el”, $item_output, $item, $depth, $args);
  }
}

Was wollen wir jetzt ändern? Zum Beispiel keine <ul><li>-Navigation sondern einfach <div> für die einzelnen Navigationselemente. Dazu das Artikelbild unterhalb, und die Description (aus dem Menue). Das sieht dann z. B. aus aus:

// Add these lines in order to fetch the additional information you wish to display

// We need the target page id in order to fetch the page image
$page = get_page_by_path(basename($item->url));
$page_id = $page->ID;
// We should check if there is an image set or not, but we are lazy for this example
$image_url = get_the_post_thumbnail( $page_id, ‘custom-image-preview’ );
// Same thing for the description
$description = esc_attr( $item->description );

// Remove the li
// Instead of $item_output = $args->before . “<a $attributes>” . $args->link_before . $title . “$lt;/a> ” . $args->link_after. $args->after;
$output .= “”;

// Change the output like you need it
$item_output = $args->before . “<div class=’container-main’><a $attributes>” . $args->link_before . $title . “</a><div class=’page-image’>” . $image_url . “</div><div class=’menu-page-description’>” . $description . “</div></div> ” . $args->link_after. $args->after;

Damit es nun auch angezeigt wird, muss der Aufruf von wp_nav_menu modifiziert werden. Beispielsweise so:

wp_nav_menu( array( ‘theme_location’ => ‘my-custom-navigation’,
    ‘menu’ => ”,
    ‘container’ => ‘nav’, // Auto wrap navigation in <nav> area
    ‘container_class’ => FALSE,
    ‘container_id’ => FALSE,
    ‘menu_class’ => FALSE,
    ‘menu_id’ => FALSE,
    ‘echo’ => true,
    ‘fallback_cb’ => ‘wp_page_menu’,
    ‘before’ => ”,
    ‘after’ => ”,
    ‘link_before’ => ”,
    ‘link_after’ => ”,
    ‘items_wrap’ => ‘%3$s’, // Remove the ul container
    ‘depth’ => 0,
    ‘walker’ => new Custom_Walker ) );

GEOwidget nun Open-Source mit MIT Lizenz

GEOwidget ist eine Online Anwendung mit der sich beliebig viele Locations auf einer interaktiven Google Maps Karte platzieren lassen. So erstellen Nutzer in wenigen Klicks (ohne Programmierkenntnisse) mühelos Widgets für Homepages, beispielsweise um das Unternehmensnetzwerk darzustellen.

Nun ist GEOwidget unter der MIT Lizenz in das Google Code Repository gewandert. Jeder kann die Anwendung nun selbst betreiben und weiterentwickeln.

http://code.google.com/p/geowidget-project/

GEOwidget Homepage

Mage+ / Magento-Fork weg von Ebay!

Schön, dass die Community reagiert hat und nach vorne schaut. Nun ist die Magento 1.7.0 Version zu GitHub als Mage+ gewandert, mit dem Ziel einfacher neue Entwickler zu finden, die sich an dem Projekt beteiligen. Das ausführliche Statement zu dem Fork und dem Wechsel von SVN zu GIT kann hier nachgelesen werden: https://github.com/mageplus/mageplus/blob/master/README.md.

WordPress, eigene Templates gestalten: Individuelle Längen für die Kurzfassung von Artikeln

Auf der Artikelseite (index) möchte man gegebenenfalls die Länge der Kurzfassung (excerpt) anpassen. Aber vielleicht möchte man zusätzlich auf einer anderen Seite eine Voransicht – beispielsweise die 3 aktuellsten Beiträge – mit einer kürzer gefassten Kurzfassung der Artikel.

Für den ersten Fall braucht es lediglich diesen Eintrag in der functions.php:

function custom_excerpt_length( $length ) {
  // Standard ist 54
  return 40;
}
add_filter( ‘excerpt_length’, ‘custom_excerpt_length’, 999 );

Problem: Damit sind alle Kurzfassungen 40 Wörter lang.

Um aber nun zu differenzieren, anhand der besuchten Seite beispielsweise kann man einfach die Seite innerhalb der Funktion abfragen.

function custom_excerpt_length( $length ) {

  // Home ist index
  if( is_home() ){
    return 40;
  }else{
    return 10;
  }
}

add_filter( ‘excerpt_length’, ‘custom_excerpt_length’, 999 );

PHP 5.4.0 released


Neben vielen kleinen Fixes und Verbesserungen, wurden folgende wesentliche Funktionen hinzugefügt:

  • Traits: Methode zur Wiederverwendung von Code

    Erläuterung: Traits ist ein Mechanismus zur Wiederverwendung von Code, der in Programmiersprachen mit einfacher Vererbung wie PHP verwendet wird. Ein Trait kann verwendet werden die Beschränkungen der einfachen Vererbung aufzuweichen indem er erlaubt, dass Mengen von Methoden frei in mehreren unabhängigen Klassen die in verschiedenen Klassenhierarchien stecken wiederzuverwenden. Die Semantik der Kombination von Traits und Klassen ist so definiert, dass die Komplexität reduziert wird und die üblichen Probleme vermeidet, die mit Mehrfachvererbung und Mixins in Verbindung gebracht werden.
    Ein Trait hat Ähnlichkeit mit einer Klasse ist aber nur dafür vorgesehen Funktionalität in einer feingranularen und konsistenten Art und Weise zu bündeln. Es ist nicht möglich einen Trait aleinstehend zu instantiieren. Es handelt sich um einn Zusatz zur traditionellen Vererbung und erlaubt horizolntale Komposition von Verhaltensweisen, d.h. die Verwendung von Klassenmethoden ohne Vererbung vorauszusetzen.

  • Built-in webserver für CLI (Command Line Interpreter)
  • Code wurde von alten “deprecated” Funktionen gesäubert

Darüber hinaus soll PHP 5.4 deutlich leistungsfähiger sein, vor allem dank der verbesserten Zend Engine.

Es wurde auch einige Funktionen entfernt, die sich ggf. beim Upgrade durch mangelnde Kompatibilität bemerkbar machen könnten.

  • Register globals, magic quotes und safe mode wurden entfernt
  • break/continue $var Syntax wurde abgeschafft
  • allow_call_time_pass_reference wurde aus der php.in entfernt
  • default_charset ist jetzt UTF-8

E-Mail Adressen mit Javascript bzw. JQuery vor Grabbern schützen

Wenn man seine E-Mail Adresse oder die von anderen einfach als HTML Code veröffentlicht, besteht die Gefahr, dass die Adressen von Skripten maschinell eingelesen werden, mit dem Zweck diese als Empfänger für Spam zu nutzen. Es gibt einige mehr oder minder effektive Möglichkeiten, die Adressen für Homepagebesucher sichtbar zu machen, aber das automatisierte Ablesen zu erschweren.

Eine davon ist die Adresse von eindeutigen Merkmalen wie @ (jede E-Mail Adresse besitzt bekannterweise genau ein @) oder . (als Trennzeichen zwischen Domain und TLD) zu bereinigen, in dem man diese Zeichen durch Marker ersetzt und zur Laufzeit dann mit den richtigen Zeichen austauscht.

Also, anstatt im HTML Quelltext zu schreiben
<a href=”mailto:mailname@domain.tld”>mailname@domain.tld</a>
schreiben wir
<span class=”amailto”>mailname at domain dot tld</span>
Javascript (JQuery):
$(document).ready(function(){
  var at = / at /;
  var dot = / dot /g;
  $(“span.amailto”).each(function(){
    var addr = $(this).text().replace(at,”@”).replace(dot,”.”);
    $(this).after(“<a href=’mailto:”+addr+”‘ title=’E-Mail senden’>”+ addr +”</a>”);
    $(this).remove();
  });
});

Wie kann man die Rufnummer bei Telefonaten zwischen Sipgate Teilnehmern und Asterisk anzeigen (anstatt interne Sipgate-ID)?

AsteriskAnrufe zwischen Sipgate Teilnehmern werden automatisch als SIP-Anrufe geroutet, selbst wenn man die “externe” Telefonnummer anruft. Das hat den Vorteil, dass die Anrufe zwischen den Sipgate Teilnehmern nichts kosten, da die Telefonate über Internet abgewickelt werden. Schön wäre es aber auch zu wissen, wer mich anruft 😉

Problem:
In der From-Header steht dann nicht die Telefonnummer des Anrufers sondern die SIP-URL (z.B. <sip:12345e0@sipgate.de>). Die von Asterisk gesetzte Variable CALLERID(num) beinhaltet dann nur noch die Sipgate SIP-UserID wie z.B. 12345e0. Die an Asterisk angeschlossenen Telefone können meistens damit nichts anfangen. Wenn die ID einen Buchstaben enthält (hier im Beispiel ‘e‘), führt es dazu, dass manch ältere Telefone gar keine Rufnummer anzeigen. Besonders ärgerlich ist es, wenn man einen Anruf verpasst hat und die Rufnummer nicht mehr zuordnen kann, wer tatsächtlich angerufen hat.

Lösungsweg:
Schaut man sich die SIP Header an, stellt man fest, dass die gewünschte Information in dem Headerelement “P-Asserted-Identity” enthalten ist:

INVITE sip:5000@10.0.0.33 SIP/2.0
...
From: <sip:12345e0@sipgate.de>;tag=CAFEBABE
To: <sip:072198765432@sipgate.de>
Contact: <sip:12345e0@12.34.56.78;uniq=CAFEAFFE23>
...
P-Asserted-Identity: <sip:072112345678@sipgate.de>

Bei anderen Anbietern kann das Format abweichen. Mehr dazu in http://www.ietf.org/rfc/rfc3325.txt.

Zwecks Demonstration habe ich einen kleinen Dialplan für Asterisk geschrieben:

; debug
exten => 5000,1,NoOp(Caller-ID: ${CALLERID(all)})
exten => 5000,2,NoOp(SIP From: ${SIP_HEADER(From)})
exten => 5000,3,NoOp(SIP To  : ${SIP_HEADER(TO)})
exten => 5000,4,NoOp(SIP PAI : ${SIP_HEADER(P-Asserted-Identity)})

; try to extract phone number from sip header P-Asserted-Identity
exten => 5000,5,Set(FON=$["${SIP_HEADER(P-Asserted-Identity)}" : "<sip:([0-9]+)"])
exten => 5000,6,ExecIf($[${ISNULL(${FON})}=0]?Set(CALLERID(num)=${FON}))

; debug
exten => 5000,7,NoOp(Caller-ID: ${CALLERID(all)})
...

Erläuterung:
5: Wir extrahieren die Nummer mit RegExp und speichern das Ergebnis in die Variable FON.
6: Falls FON nicht null ist, ersetzen wir die CALLERID(num) mit dem Wert von FON.

Hier zwei UseCases und Ausgabe von Asterisk:
Teinehmer für das Beispiel (Telefonnummer, IPs sowie alle TAGs sind verschleiert).
Angerufene (Asterisk mit Sipgate-Account):
– Telefonnumber = 072198765432
Anrufer 1 (Fritzbox mit Sipgate-Account):
– Sipgate ID = 12345e0
– Telefonnumber = 072112345678
Anrufer 2 (Mobil):
– Telefonnumber = 017112345678

Case 1: Anrufer 1 (sipgate -> sipgate):

-- Exec...1] NoOp("SIP/sipgate.de-000000b6", "Caller-ID: "" <12345e0>") in new stack
-- Exec...2] NoOp("S..b6", "SIP From: <sip:12345e0@sipgate.de>;tag=CAFEBABE") in new stack
-- Exec...3] NoOp("S..b6", "SIP To  : <sip:072198765432@sipgate.de>") in new stack
-- Exec...4] NoOp("S..b6", "SIP PAI : <sip:072112345678@sipgate.de>") in new stack
-- Exec...5] Set("S..b6", "FON=072112345678") in new stack
-- Exec...6] ExecIf("S..b6", "1?Set(CALLERID(num)=072112345678)") in new stack
-- Exec...7] NoOp("S..b6", "Caller-ID: "" <072112345678>") in new stack
-- Exec...8] ...

Exec…5: Die externe Rufnummer des Anrufers wurde in FON reingeschrieben
Exec…6: 1? => Kondition erfüllt => ersetze CALLERID(num)
Exec…7: Verifizierung, dass die Nummer ersetzt wurde (vgl. Exec…1)

Case 2: Anrufer 2 (mobil -> sipgate):

-- Exec...1] NoOp("S..b8", "Caller-ID: "017112345678" <017112345678>") in new stack
-- Exec...2] NoOp("S..b8", "SIP From: "017112345678" <sip:017112345678@sipgate.de>;tag=cafebabe") in new stack
-- Exec...3] NoOp("S..b8", "SIP To  : <sip:004972198765432@sipgate.de>") in new stack
-- Exec...4] NoOp("S..b8", "SIP PAI : ") in new stack
-- Exec...5] Set("S..b8", "FON=") in new stack
-- Exec...6] ExecIf("S..b8", "0?Set(CALLERID(num)=)") in new stack
-- Exec...7] NoOp("S..b8", "Caller-ID: "017112345678" <017112345678>") in new stack
-- Exec...8] ...

Exec…5: Patternmatching schlägt fehl, da der Header nicht gesetzt ist, somit is die Variable FON null.
Exec…6: 0? => Kondition nicht erfüllt => nichts tun
Exec…7: Verifizierung, dass die Nummer unverändert geblieben ist (vgl. Exec…1)

Die Endgräte zeigen nun immer die externe Rufnummer des Anrufers an. Somit kann der Anrufer bei einem verpassten Anruf auch zurückgerufen werden.

Viel Spass,

= C. | SaaS Web Techniklabor =

P.S.: Lustig ist, dass die App von Sipgate auch nur die interne ID anzeigt (“Anruf von 12345e0”) und man verwirrt ist, wer nun wirklich anruft…