Widgets in WordPress Themes ermöglichen

Da ich gerade selbst darüber gestolpert bin: Widgetizing Themes

Wie kann ich Widgets in meinem WordPress Theme nutzen?

Gehen wir von folgendem Sidebar-Code aus:

<ul id="sidebar">
 <li id="about">
  <h2>About</h2>
  <p>This is my blog.</p>
 </li>
 <li id="links">
  <h2>Links</h2>
  <ul>
   <li><a href="http://example.com">Example</a></li>
  </ul>
 </li>
</ul>

Mit zwei kleinen Änderungen aktivieren wir Widgets in unserer Sidebar:

<ul id="sidebar">
<?php if ( !function_exists('dynamic_sidebar')
        || !dynamic_sidebar() ) : ?>
 <li id="about">
  <h2>About</h2>
  <p>This is my blog.</p>
 </li>
 <li id="links">
  <h2>Links</h2>
  <ul>
   <li><a href="http://example.com">Example</a></li>
  </ul>
 </li>
<?php endif; ?>
</ul>

Hier die zwei Zeilen noch einmal:

<?php if ( !function_exists('dynamic_sidebar')
        || !dynamic_sidebar() ) : ?>
[...]
<?php endif; ?>

Wenn nun in den Theme-Einstellungen Widgets hinzugefügt werden, werden diese angezeigt, ansonsten die statische Sidebar.

Wollen wir aber unsere komplizierte Sidebarstruktur behalten, die uns eben ganz bestimmte Inhalte in ganz bestimmten Bereichen (Seiten, Blogbereich oder Archiven; siehe Conditional Tags) ausgeben, dann nutzen wir diese zwei Zeilen einfach an einer beliebigen Stelle innerhalb unseres Kontrukts.
Mein Beispiel: Mein Blogbetreiber hat verschiedene inhaltliche Bereiche, die jedesmal mit anderen Sidebarinhalten zusammen gehören. Uns an einer einzigen Stelle (in normalen Blogbetrieb) will er eigenen HTML-Code anzeigen.

Beachte: Wenn wir Widgets nutzen wollen, müssen wir dies in der functions.php unseres Themes aktivieren. Siehe Widgetizing Themes

WordPress, Polyglot und Templates

So, nach langem Suchen habe nicht ich die Lösung gefunden, sondern wieder einmal der toocan.

Problem: Wer mehrere Sprachen in einem WordPress-Blog verwenden möchte, landet früher oder später bei Polyglot (wie ich) oder Language Switcher. Dann müssen aber Templates angepasst werden, damit der Besucher eben alles in seiner Sprache lesen kann. Das geht zum einen über gettext und ist verdammt aufwendig (immerhin müssen die Sprachdateien und die Ausgaben im Template angepasst werden…. bäh)

Oder man nutzt die Polyglot-interne Möglichkeit eines Filters: polyglot_filter()

Will man also in der Sidebar alle Kategorien anzeigen lassen und hat dazu den Titel „Kategorien“ vorgesehen, benötigt aber dasselbe für englischsprachige Besucher, dann könnte das so aussehen:

polyglot_filter('[lang_de]Kategorien[/lang_de][lang_en]Categories[/lang_en]')

Das kommt einfach ins Template an die Stelle, an der nachher die Liste mit den Kategorien erscheinen soll, also irgendwo vor wp_list_categories().

Übrigens:
Das funktioniert nicht nur in Themes, sondern auch in Plugins, die Daten aus der Datenbank holen und eben nicht für die Mehrsprachigkeit vorbereitet haben, sondern sie fein mit den bekannten polyglotschen eckigen Klammern zur Sprachzuordnung anzeigt. Das ist nicht nur hässlich, sondern auch verwirrend.

Nun, aber fein ans Übersetzen.

ACL im ZF auf Actionebene

Nun, da ich schon einige Male gefragt wurde, wie am besten zu lösen (wobei ich nicht sagen kann, ob dies die beste Lösung ist), poste ich mal ‚unsere‘ Möglichkeit:


[...]
$acl_resources = array();
 foreach ($this->getFrontController()->getControllerDirectory() as $module => $cntrl_path)
 {
    $files = scandir($cntrl_path);
    foreach ($files as $file)
    {
        if (preg_match('/^([\\w]*)Controller\.php$/i',$file,$hits))
        {
          $classPrefix = ($module == 'default') ? '' : ucfirst($module).'_';
          $className = $classPrefix.$hits[1].'Controller';
          require_once($cntrl_path.DIRECTORY_SEPARATOR.$file);
          if (class_exists($className))
          {
            $refl_class = new ReflectionClass($className);
            foreach ($refl_class->getMethods() as $refl_method)
            {
                if (preg_match('/^([\\w]*)Action$/i',(string) $refl_method->getName(),$matches))
                {
                    $acl_resources[$refl_method->getDeclaringClass()->getName()][] = array(
                                                                                           'action'         => $matches[0],
                                                                                           'action_short'   => strtolower($matches[1])
                                                                                           );
                }
            }
          }
        }
    }
}
[...]

Wenn’s gefällt, viel Spass – ansonsten bin ich über Kommentare/ Kritik sehr erfreut.

Gruß tucci