Kategorie: Entwicklung

Eine Über­sicht unse­rer Bei­trä­ge zur Ent­wick­lung für WordPress und Atlassian Confluence.

Was ist der Nutzen des WP_Term_Query?

Für Ent­wick­ler bringt die neue WordPress Ver­si­on 4.6 eine ver­bes­ser­te Mög­lich­keit mit dem WP_Term_Query, Terms aus der Daten­bank abzufragen.

Was sind Terms?

Ein Term ist ein Begriff der zu einer Taxo­no­mie gehört. Eine Taxo­no­mie besteht aus einem bis meh­re­ren Terms. Ein oder meh­re­re die­ser Terms kön­nen mit einem Bei­trag ver­knüpft wer­den. Das Ziel die­ser Ver­knüp­fung ist es, Bei­trä­ge zu Kate­go­ri­sie­ren um spä­ter schnel­ler nach Bei­trä­gen fil­tern zu können.

Ein Bei­spiel dafür ist die Taxo­no­mie Fahr­zeug­ty­pen die alle ver­wen­de­ten Fahr­zeug­ty­pen beinhal­tet. Der Fahr­zeug­typ wie Klein­wa­gen, Mit­tel­klas­se, Kom­bi oder Gelän­de­wa­gen ist ein Term.
Ein Bei­trag über einen VW Polo kann dann mit einem Klein­wa­gen und einer über einen Golf mit den Fahr­zeug­ty­pen Klein­wa­gen und Mit­tel­klas­se ver­knüpft werden.

Neue Taxo­no­mien wie die aus dem Bei­spiel kön­nen zu allen Bei­trags­ty­pen hin­zu­ge­fügt wer­den. Die bestehen­den Kate­go­rien von Bei­trä­gen sind im Hin­ter­grund nichts ande­res als Terms inner­halb der Taxo­no­mie “cate­go­ry” und die Schlag­wor­te nichts ande­res als Terms inner­halb der Taxo­no­mie “post_tag”.

Abfragen von Terms

Die Klas­se WP_Term_Query hilft uns WordPress Ent­wick­lern Terms wie schon die Bei­trä­ge (WP_Query), Nut­zer (WP_User_Query) und Kom­men­ta­re (WP_Comment_Query) aus der Daten­bank abzufragen.

Die­se WordPress-Klas­sen brin­gen vie­le Mög­lich­kei­ten mit, ein Ele­ment auf einem stan­dar­di­sier­ten Weg aus der Daten­bank zu fil­tern. Das hat den Vor­teil das nicht jeder Ent­wick­ler eige­ne Daten­bank­ab­fra­gen schrei­ben muss. Inner­halb die­ser Klas­sen wird die Caching-API von WordPress ver­wen­det wel­che die Daten­bank­ab­fra­gen redu­ziert und die Anwen­dung schnel­ler macht.
Wei­ter­hin sind die­se Klas­sen gene­rell siche­rer in der Ver­wen­dung. Das liegt einer­seits dar­an, dass die Fil­te­rung von Ein­ga­ben durch den Benut­zer berück­sich­tigt wird und vie­le Ent­wick­ler über die­sen Quell­code geschaut haben (Stich­wort Code­re­view). Ande­rer­seits kön­nen durch WordPress-Updates Feh­ler inner­halb die­ser Klas­sen ein­fach und schnell beho­ben werden.
Mit der Stan­dar­di­sie­rung fällt es Ent­wick­lern auch viel leich­ter den Quell­code für Feh­ler­ana­ly­sen zu verstehen.
Eige­ne Abfra­gen zu schrei­ben lässt sich in bestimm­ten Fäl­len nicht ver­mei­den. Hier muss dann jedoch auf die Effi­zi­enz (Inte­gra­ti­on der Caching API) und die Sicher­heit geach­tet werden.

Fazit

Mit dem der Ein­füh­rung der Klas­se WP_Term_Query wird der Quell­code für die eige­ne Ent­wick­lung wei­ter stan­dar­di­siert. Kom­ple­xe und schlecht Wart­ba­re und damit feh­ler­an­fäl­li­ge Daten­bank­ab­fra­gen wer­den redu­ziert. Die Ver­ständ­lich­keit für das Lesen von Quell­code wird erhöht.

Automatische Ersetzung des Bindestrichs durch einen Gedankenstrich verhindern

Nicht alle auto­ma­ti­schen Erset­zun­gen des Tex­tes im WordPress-Edi­tor sind sinn­voll oder gewollt. Mei­ner Mei­nung nach gehört die auto­ma­ti­sche Erset­zung des ein­fa­chen Bin­de­strichs mit dem Gedan­ken­strich dazu. Das Pro­blem dabei ist, dass der Edi­tor im Visu­el­len Modus immer noch den Bin­de­strich aus­spuckt aber inner­halb der sicht­ba­ren Sei­te ein Gedan­ken­strich zu sehen ist.

WordPress hat intern für die Opti­mie­rung des Inhalts einen Fil­ter-Hook the_content. Die­ser Hook greift nach­dem der Inhalt aus der Daten­bank geholt wur­de und bevor er ins HTML z.B. über die the_content() Funk­ti­on geschrie­ben wird.

Automatische Ersetzung für den Inhalts-Hook entfernen

Im WordPress sind stan­dard­mä­ßig die Funk­tio­nen wpau­top und wptex­tu­ri­ze auf den the_content Hook regis­triert. Für die auto­ma­ti­sche Erset­zung des Bin­de­strichs ist die wptex­tu­ri­ze-Funk­ti­on ver­ant­wort­lich. Der Auf­ruf kann für den Inhalts-Hook in der functions.php über fol­gen­de Quell­code­zei­le dere­gis­triert werden.

remove_filter('the_content', 'wptexturize');

Damit sind jedoch alle auto­ma­ti­schen Inhalts­op­ti­mie­run­gen die­ser Funk­ti­on dahin.

Automatische Ersetzung für weitere Hooks entfernen

Neben dem Inhalts-Hook ist die wptex­tu­ri­ze-Funk­ti­on auch auf dem Title-Hook und dem Excerpt-Hook regis­triert und kann dere­gis­triert werden.

remove_filter('the_title', 'wptexturize');
remove_filter('the_excerpt', 'wptexturize');

 

Anzahl Produkte für WooCommerce programmatisch setzen

Manch­mal ist es not­wen­dig die Anzahl der vor­ein­ge­stell­ten Pro­duk­te im WooCommerce zu erhö­hen oder zu ernied­ri­gen. Die­ser kur­ze Arti­kel zeigt wie es geht.

In der functions.php muss dazu der Fil­ter “loop_shop_per_page” um die eige­ne Funk­ti­on erwei­tert werden.

add_filter( 'loop_shop_per_page', function ( $cols ) {
    // Anzahl der Produkte
    return 16;
}, 20 );

Die­se Funk­ti­on gibt die Anzahl der Pro­duk­te im Shop (im Bei­spiel sind es 16) zurück. Der Fil­ter hat als zwei­ten Para­me­ter noch die Prio­ri­tät (im Bei­spiel ist es 20).

Paginierung auf der Beitragsseite oder auf der Seite eines Content-Typen

In man­chen WordPress-Anwen­dungs­fäl­len kommt es vor, dass im Tem­p­la­te “single.php” für einen Bei­trag oder für einen benut­zer­de­fi­nier­ten Con­tent Typen im Tem­p­la­te “single-{post_type}.php” eine Pagi­nie­rung statt­fin­den soll.

Ein Bei­spiel wäre hier, dass alle wei­te­ren Bei­trä­ge oder Con­tent Typen direkt unter dem Inhalt des Bei­tra­ges oder Con­tent Typen ange­zeigt und in die­sem auch pagi­niert wer­den können.

Pro­blem dabei ist, dass der Fil­ter “redirect_canonical” bei einem Auf­ruf der Bei­trags­sei­ten oder Sei­te des Con­tent Typen mit den Per­ma­link-Para­me­tern für die Pagi­nie­rung “…/beitrag/page/x”  dazwi­schen­funkt und auf “../beitrag/” wei­ter­lei­tet. Der Fil­ter kann über fol­gen­den Code ange­passt werden:

add_filter( 'redirect_canonical', 'namespace_redirect_canonical' );
function namespace_redirect_canonical( $redirect_url ) {

    if ( is_singular( 'MY_CUSTOM_POST_TYPE' ) ){
        $redirect_url = false;
    }

    return $redirect_url;
}

Das Bei­spiel schal­tet die Wei­ter­lei­tun­gen für ein­kom­men­de Links für den Bei­trags­ty­pen “MY_CUSTOM_POST_TYPE” aus. Ob eine Wei­ter­lei­tung not­wen­dig ist, kann als Erwei­te­rung die­ses Bei­spiels abge­prüft wer­den und bei Bedarf mit Pagi­nie­rungs-Para­me­tern wei­ter­ge­lei­tet werden.