Kategorie: Wordpress

  • WordPress: Multisite in Foldern und nginx

    WordPress bietet von Haus aus die Verwaltung von so genannten Multisite-Umgebungen an. Sprich man kann mehrere Blogs / Webseiten mit einer Installation verwalten. Selbiges kennt man auch aus Typo3. Ich kannte diese Installationen bisher eher domainbasiert. Ich habe also entweder Subdomains oder „richtige“ Domains, unter welchem der jeweilige Blog läuft. Beispiel: blog.kundenname1.de, www.kundenname1.de, www.kundenname2.de. Das funktioniert im Regelfall recht gut ohne weitere Anpassungen von nginx.

    Aufgabe

    Neulich hatte ich jedoch einen Sonderfall: Es soll für den Blog zunächst eine Auswahlseite geben. Von dieser aus kommt man auf die unterschiedlichen Blogs. Das liesse sich auch über einfach über Kategorien lösen. Allerdings sollen die einzelnen Benutzer innerhalb ihres „Blogs“ bleiben und nicht die Beiträge der anderen Benutzer sehen. Die beiden Blogs sollten in Unterverzeichnissen verfügbar gemacht werden:

    kundenname.de – Blogauswahl
    kundenname.de/blog1 – Blog zum Unternehmensbereich 1
    kundenname.de/blog2 – Blog zum Unternehmensbereich 2

    Um dies zu erreichen kann man einfach die Standard Multisite-Installation von WordPress durchführen.Eine gute Anleitung findet sich hier. Dabei gilt es darauf zu achten diese mit Subdirectories einzurichten, eine spätere Änderung hat sich als nicht ganz so trivial herausgestellt. Anschliessend richtet man sich über die Netzwerkverwaltung die einzelnen Blogs „Blogauswahl“, „Blog 1“ und „Blog 2“ ein. Jedoch sind bis auf die Blogauswahl die beiden Blogs mit ihren Verzeichnissen nicht erreichbar. Man kommt nur auf den Blog Übersicht, die anderen beiden Blogs bringen im Backend wie Frontend einen Fehler 500

    Hierfür muss man die Konfiguration in nginx etwas anpassen, was jedoch mit ein paar zusätzlichen Zeilen erledigt ist.

    server {
        listen   80;
    
        root /var/www/kundenname.de/htdocs;
            index index.php;
    
        server_name kundenname.de;
    
        error_log /var/log/nginx/kundenname.de.error.log;
        access_log /var/log/nginx/kundenname.de.access.log;
    
    
        client_max_body_size 100M;
        client_body_buffer_size 128k;
    
    
        if (!-e $request_filename) {
            rewrite /wp-admin$ $scheme://$host$uri/ permanent;
            rewrite ^(/[^/]+)?(/wp-.*) $2 last;
            rewrite ^(/[^/]+)?(/.*\.php) $2 last;
        }
    
        location / {
            try_files $uri $uri/ /index.php?$args ;
        }
    
        location ~ \.php$ {
            try_files $uri =404;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass 127.0.0.1:9001;
            fastcgi_read_timeout 300;
        }
    
        location ~* \.(js|css|png|jpg|jpeg|gif|ico|webp)$ {
            expires 8d;
            log_not_found off;
            gzip  on;
        }
    }

     

  • woocommerce: Related products nur nach Tags anzeigen

    Über das beliebte E-Commerce Plugin woocommerce kann man sich in der Detailansicht verwandte Produkte anzeigen lassen. Woocommerce zieht sich in der Detailansicht für verwandte Produkte alle Produkte, die in der selben Kategorie liegen oder die selben Tags (Schlagwörter) gepflegt haben. Weiterhin kann man das Limit, wie viele verwandte Produkte angezeigt werden sollen, verändert werden. Alles in Allem kann man sagen: Äusserst Redakteursfreundlich, da es einfach angezeigt wird und 99% von selbst erledigt wird bzw. erledigt ist.

    Wenn man aber eine Kategorie hat, in der sich alle Produkte befinden müssen, passt das oben aufgeführte Verhalten „verwandte Produkte aus Kategorie und Tags“ leider nicht mehr. Als Beispiel ein kleiner Kategoriebaum:

    • Alle Produkte
      • Hosen
        • Jeans
        • Anzughosen
      • Hemden
        • Kurzarm
        • Langarm
      • Spiritousen
        • Gin
        • Rum

    Da alle Produkte in der obersten Kategorie „alle Produkte“ liegen, werden zum Beispiel bei der Anzeige einer Jeans unter Umständen auch Produkte aus der Kategorie „Gin“ angezeigt. Das passt nicht zusammen.

    Nach einer etwas Recherche und Prüfung des Codes bin ich auf folgenden Filter gestoßen:

    add_filter( 'woocommerce_get_related_product_cat_terms', '__return_empty_array' );

    In der Funktion get_related der Klasse WC_Product (plugins/woocommerce/includes/abstract/abstract-wc-products.php) kann man durch den Filter eingreifen und so die Produktkategorien leeren. Wenn jedoch der Cache für die verwandten Produkte vorhanden ist oder nicht genug Produkte vorhanden sind, sucht Woocommerce wieder Produkte aus der selben Kategorie heraus. Somit kann es sein dass hier bei der Jeans wieder ein Gin, ein Rum oder ein sonstiges nicht passendes Produkt erscheint.

    Es gibt aber noch eine weitere Stelle, an welcher man eingreifen kann. Diese befindet sich in der selben Klasse und heisst build_related_query. Hier kann man über den Filter

    add_filter( 'woocommerce_product_related_posts_relate_by_category', function() {
    	return false;
    } );

    recht einfach, schnell und sicher die Kategorien zurücksetzen. Wenn das erledigt wurde sollte man noch die gecachten verwandeten Produkte leeren, was ich über die Console mit WP-CLI erledigt habe:

    wp transient delete-all