WordPress: Kategorie-Liste scrollt nicht mehr [Lösung]

Seit dem Update auf WordPress 6.6 lassen sich Kategorie-Listen im Admin-Bereich nicht mehr scrollen, Stattdessen werden sie komplett angezeigt – also alle Kategorien untereinander in einer alphabetischen Liste.

Wenn man nur 3-4-5 Kategorien verwendet mag das nicht weiter stören. Wenn man in seiner WordPress-Website aber dutzende oder sogar hunderte Kategorien verwendet kann das dazu führen, dass sich die Kategorien kaum noch sinnvoll nutzen lassen. Die Eingabemaske wird entsprechend der langen Kategorie-Liste in die Länge gezogen – und wer das Kategorie-Widget aus der rechten Seitenleiste in den Hauptbereich z.B. unterhalb des Texteditors gezogen hat ein Problem.

Ich hatte genau diese Anordnung – also die Kategorie-Liste unterhalb des WYSIWYG-Editors – gefolgt von einer Reihe eigener Eingabefelder, die ich über Advanced Custom Fields Pro (ACF) angelegt hatte. Nach dem Update wurden diese ACF-Felder nun von der ausgeklappten Kategorie-Liste in fast unerreichbare Tiefen hinunter gedrückt. Ein Zustand, den man vielleicht ein paar Tage lang ignorieren kann – der aber ein flüssiges Arbeiten mit WordPress fast unmöglich macht.

Ich muss dazu sagen, dass ich „natürlich“ den Classic Editor bevorzuge – und dass dieses Problem offenbar nur im Classic Editor auftritt. So lautet eine der Empfehlungen dann auch, nicht den Classic Editor zu nutzen. Diese Option scheidet für mich aber aus, da ich es gewohnt bin, meine EIngabemasken selbst zu bauen und so zu gestalten, wie ich es möchte.

Im WordPress-Forum fand ich dann eine einfache Lösung für das Problem: per CSS kann man die Kategorie-liste dazu bringen, sich so zu verhalten, wie vor dem Update – also so, dass sich alle Kategorien scrollen lassen.

Der CSS-Schnippsel würd eregulär über ein Stylesheet funktionieren, wenn man denn für den Administrationsbereich ein Stylesheet definiert hat. Das ist sicherlich eher selten der Fall. Per PHP lässt sich der CSS-Schnippsel aber auch einfach über die functions.php in den Admin-Bereich einbauen:

add_action('admin_head', 'admin_css_code');
function admin_css_code()
{
echo '<style>

.categorydiv div.tabs-panel
{
max-height: 200px;
}

</style>';
}

Der Code stammt ursprünglich von dem Nutzer @vinodkkumar –– allerdings waren bei seinem Lösungsvorschlag leider die Anführungszeichen falsch formatiert. Ich habe den Code-Schnippsel sozusagen repariert – einfach per copy-paste in die funstions-php einfügen und schon lässt sich die Kategorie-Liste wieder scrollen.

Hier die Diskussion im WordPress-Forum:
wordpress.org/support/topic/category-list-no-longer-scrolling/

WordPress Dashboard-Felder ‚Boxen über „Ansicht anpassen“ hinzufügen‘ entfernen

Im Plugin White Label CMS > “Einstellungen Tab” > “Custom CSS for Admin” folgenden CSS-Code hinzufügen:

#dashboard-widgets .postbox-container .empty-container{
    display: none;
}

Oder den CSS-Code in einem eigenen Stylesheet hinterlegen, das im Admin-Bereich geladen wird.

Die Lösung habe ich hier gefunden:

https://wordpress.org/support/topic/remove-add-boxes-from-the-screen-options-menu/

Parent-Child-Seiten – Parent-ID und Child-Tiefe herausfinden

Parent Page Wordpress

Neben einfachen Beiträgen kann man mit einer Standard-Installation von WordPress in der Regel auch Seiten (bzw. Pages) anlegen. Inhalte vom Typ Page lassen sich einfach hierarchisch organisieren – eine Funktion, die selten voll ausgenutzt wird. Mithilfe eines Seitenbaums, bei dem eine beliebige Anzahl von Seiten per Parent-Child-Verbindung hierarchisch organisiert ist, lassen sich komplexe Verzeichnisse aufbauen. Aber wie behält man den Überblick?

Zunächst ist es häufig hilfreich, die ID der übergeordneten Parent-Seite für jede beliebe Seite nutzen zu können. WordPress bringt diese Funktionalitöt mit – jede Seite weiß im Prinzip, wessen Kind (Child) sie ist. Oder um es etwas korrekter auszudrücken: die ID der Parent-Seite ist immer auch Teil des Post-Objektes.

global $post;
$parent_ID = $post->post_parent;

Mithilfe dieses Snippets lassen sich schon eine ganze Menge Dinge umsetzen.

Was aber, wenn man es mit einer mehrstufigen Hierarchie zu tun hat?

Auch dafür gibt es Bordmittel: get_post_ancestors

Über diese Funktion lassen sich im Prinzip alle „vererbenden“ Eltern-Seiten finden – also alle übergeordneten „Parent-Pages“.

(leider habe ich diesen beitrag nie komplettoert. Ich bitte das zu entschuldigen.)

WordPress: alle Original-Bilder finden und auflisten (obwohl nur ‚medium-Bilder‘ im Text zu finden sind)

Wordpress: Original-Bilder finden

Folgende Fragestellung lag zugrunde: wie kann der Kunde alle in einer Seite bzw. in einem Artikel eingebundenen Bilder in Originalgröße finden, um diese herunterzuladen, zu bearbeiten und anschliessend wieder neu einzubinden?

Natürlich kann man alle Originalbilder auch ohne zusätzlichen Code relativ einfach ‚manuell‘ finden. Zunächst klickt man dazu mit der rechten Maustaste auf das zu tauschende Bild und wählt ‚Bild in einem neuen Tab öffnen‘ aus. Dann entfernt in der Adresszeile des Browsers die Größenangaben (z.B. „-800×600.jpg“), die WordPress immer dann an Dateinamen von Bildern anhängt, wenn das Bild skaliert wurde. Durch das Abschneiden dieses Zusatzes bekommt man das Bild in Originalgröße – bzw. das Originalbild, wie es einmal hochgeladen wurde. Dieses speichert man dann lokal auf dem Computer, kann es anschliessend bearbeiten und neu hochladen. Man wählt in der Admin-Ansicht einfach das Bild aus, das getauscht werden soll und geht in der Bild-Bearbeiten-Ansicht auf „Bild ersetzen“. Nun kann man das neue Bild hochladen.

Noch einfacher geht es natürlich, wenn man seine Bilder gut organisiert hat und das Bild direkt auf der lokalen Festplatte findet – dann kann man sich das Herunterladen sparen.

Beide Optionen fielen in der mir gestellten Anfrage leider aus – die Originalbilder waren nicht aufzufinden und der Trick mit der rechten Maustaste war zu umständlich. Also sollte eine Liste aller Bilder generiert werden, über die man die Originalbilder direkt herunterladen sollte.

Das Artikelbild (post thumbnail) sowie alle anderen als Attachment gespeicherten Bilder lassen sich relativ finden.

/* Alle Attachment-Bilder finden - kommt ins Template */

$images = get_children( array( 'post_parent' => get_the_ID(), 'post_type' => 'attachment', 'post_mime_type' => 'image', 'orderby' => 'menu_order', 'order' => 'ASC', 'numberposts' => 999 ) ); 
 if ( $images ) {

//looping through the images
 foreach ( $images as $attachment_id => $attachment ) {
 
 $img_path_array = (wp_get_attachment_image_src( $attachment_id, 'full' ));?>
 <a href="<?PHP echo($img_path_array[0]); ?>" target="_blank"><?PHP echo wp_get_attachment_image( $attachment_id, 'full' ); ?></a>

<?php
 }
 ?><?php
 
 }

Bei den im Text platzierten Bildern ist das schon ein bisschen schwieriger – diese sind ja nicht als Attachment abgelegt. Also müssen wir zunächst mal alle Bilder finden, die in den Text (content) eingebunden sind. Dazu durchsuchen wir den Seiteninhalt nach dem Codeschnippsel „src=“, der uns verrät, dass dort ein Bild zu finden ist.

Das klappt soweit auch ganz gut – allerdings bekommen wir einen Array der Bilder, wie sie im Text eingebunden sind – also mit angehängten Pixelmaßen (z.B. „bild-800×600.jpg). Mithilfe der Funktion get_original_image können wir aber die Originalbilder herausbekommen.

/* Alle Inline-Bilder finden - dieser Code-Schnippsel kommt ins Template */
 $regex = '/src="([^"]*)"/';
 $content = $post->post_content;
 // echo($content);
 preg_match_all( $regex, $content, $matches );

foreach($matches[1] as $image):
 
  $the_orig_image = get_original_image( $image);

  echo '<a href="'.$the_orig_image.'" target="_blank"><img src="'.$the_orig_image.'"></a>';
  $ii++;

endforeach;
/* Die Funktion get_original_image kommt in die functions.php des Themes */
function get_original_image( $url ) { 
global $_wp_additional_image_sizes; $new_url = $url; // Get All Image Sizes 
$builtin_sizes = // *** BREAK WAS MISSING *** 
 array( 'large' => array( // *** WRONG ARROW "=–>" ***
 'width' => get_option('large_size_w'),
 'height' => get_option('large_size_h')
 ),
 'medium' => array(
 'width' => get_option('medium_size_w'),
 'height' => get_option('medium_size_h')
 ),
 'thumbnail' => array(
 'width' => get_option('thumbnail_size_w'),
 'height' => get_option('thumbnail_size_h')
 )
 );

$image_sizes = array_merge( $builtin_sizes, $_wp_additional_image_sizes );

// Parse URL
$info = pathinfo( $url );

// Check to see if image is a thumbnail

// Get image size extensions, e.g. -200×200
// Get image size width only extensions, e.g., -200x
// Get image size height only extensions, e.g., x200.
$image_exts = array();
$image_exts_width = array();
$image_exts_height = array();
foreach ($image_sizes as $image_size) {
  $image_exts[] = '-'.$image_size['width'].'x'.$image_size['height'];
  $image_exts_width[] = '-'.$image_size['width'].'x';
  $image_exts_height[] = 'x'.$image_size['height'];
}

// Cycle through image size extensions, e.g. -200×200
foreach ( $image_exts as $image_ext ) {
  //if found, replace the extension with nothing
  $new_url = str_replace( $image_ext , '' , $url );

// we found an original – don't look any further
if ( $new_url != $url )
  break;
}

// if a new url hasn't been generated yet, keep looking…
if ( $new_url == $url ) {
  // Cycle through image width only extensions, e.g. -200x
  foreach ( $image_exts_width as $image_ext ) {

    // check for width, e.g., -200x
    $pos1 = strrpos( $info['basename'] , $image_ext , -1 );
    if ( $pos1 ) {
      // strip, & assign new url
      $new_url = $info['dirname'] . '/' . substr( $info['basename'] , 0 , $pos1 ) . '.' . $info['extension'];
    }

    // we found an original – don't look any further
    if ( $new_url != $url )
      break;
  }

  // if a new url hasn't been generated yet, keep looking…
  if ( $new_url == $url ) {
    // Cycle through image height only extensions, e.g. x200.
    foreach ( $image_exts_height as $image_ext ) {

      // check for height, e.g., x200
      $pos2 = strrpos( $info['basename'] , $image_ext , -1 );

      //example_2a-263×300.jpg -> example_2a.jpg
      if ( $pos2 ) {
        // get position of -, strip, & assign new url
        $pos3 = strrpos( $info['basename'] , '-' , -1 );
        $new_url = $info['dirname'] . '/' . substr( $info['basename'] , 0 , $pos3 ) . '.' . $info['extension'];
      }

      if ( $new_url != $url )
        break;
    }
  }
}

if ( $new_url != $url )
  return $new_url;
else
  return $url;
}

Die Funktion habe ich dem Artikel „How to Get Original Image from a Thumbnail Image in WordPress“ (wpsmith.net) entnommen – allerdings waren in der Original-Funktion einige Fehler vorhanden. DIese habe ich korrigiert und zum Teil oben im Code entsprechend markiert.

Was macht die Funktion ‚get_original_image‘? Zunächst werden alle möglichen Bildformate bzw. die jeweiligen Breiten und Höhen in Arrays gespeichert. Dann vergleichen wir jede Bild-URL, die im Text einer Seite gefunden wurde, mit den möglichen Höhen und Breiten. Wenn Höhe und/oder Breite im Dateinamen des Bildes vorkommen, wird die Endung mit den Angaben zu Höhe und Breite (z.B. „-800×600“) entfernt – und schon haben wir das Originalbild.

 

WooCommerce Formal: Anrede auf „Deutsch (Sie)“ umstellen

WooCommerce Formal - Anrede auf "Deutsch Sie" umstellen

Ein Problem, das immer wieder auftritt: man installiert zunächst WordPress und WooCommerce und stellt die Sprache auf Deutsch. Dabei stört es zunächst nicht, dass standardmäßig die Du-Version installiert ist. Irgendwann möchte man aber auf die formale Sprachversion „Deutsch (Sie)“ umstellen und stellt fest, dass alle WooComerce-Texte nun wieder in Englisch angezeigt werden. Das läßt sich aber mit wenigen Handgriffen korrigieren. Hier eine kurze Anleitung, was zu tun ist.

Eine Standard-WordPress-Installation ist mittlerweile in der Regel für verschiedene Sprachen vorbereitet – für den WordPress-Core gibt es eine Reihe von Übersetzungen, jeweils mit den zur Übersetzung passenden Sprachdateien. Und auch für viele Plugins und Themes gibt es inzwischen häufig auch eine deutschen Übersetzung, die kaum Wünsche offen lässt. Diese sind aber in der Regel nicht installiert.

Auch für das Shop-Plugin WooCommerce gibt es natürlich eine passende formale Sprachdatei. Um diese zu aktivieren muß man allerdings zunächst ein Update durchführen.

WooCommerce auf Deutsch Sie umstellen

WooCommerce Sprachdatei laden und auf Deutsch Sie umstellen

Zuerst stellt man WordPress also auf die formale Sprachdatei Deutsch (Sie) um. Das geht unter Einstellungen > Allgemein > Sprache der Website.

Anschliessend ruft man die ausstehenden Aktualisierungen auf. Dazu einfach oben in der Admin-Leiste das Kreis-Pfeil-Symbol anklicken. Ganz unten in der Liste sollte der dezente Hinweis versteck sein, dass neue Übersetzungen verfügbar sind. Ein Klick auf die Schaltfläche „Aktualisiere Übersetzungen“ lässt WordPress alle ausstehenden Sprachdateien automatisch installieren – und schon ist WooCommerce auf das formale „Sie“ umgestellt.

WordPress: Sprachdateien "Deutsch Sie" werden geladen

WordPress: Sprachdateien „de_DE_formal“ werden geladen

Mithilfe von Übersetzungs-Plugins wie zum Beispiel Loco Translate oder WPML kann man dann noch die Feinheiten anpassen. Und schon ist der Online Shop auf die formale Anrede „Deutsch (Sie)“ umgestellt.

Sollte es nicht möglich sein, WordPress dauerhaft auf „Deutsch (formal)“ umzustellen (Einstellung wird jedesmal zurückgesetzt) dann empfielht sich bei Verwendung von WPML folgender Weg:  In WPML > Sprachen auf “ Sprachen bearbeiten“ – den Sprachentag con de_DE auf de_DE_formal ändern.