WordPress 5.0.2, Block Lab, Gmail, WooCommerce Ajax und eigene Post Status

Diese Woche gab es wieder einige Dinge mit denen ich beschäftigt war und dir Probleme bereiteten. Welche Probleme das waren und ob die Lösung vielleicht auch dir helfen könnte, liest du hier.

WordPress 5.0.2

Nachdem Update war es mir nicht möglich Beiträge, Seiten oder andere Beitragstypen zu erstellen (alle die den Block Editor) verwendeten. Erst hatte ich alle Plugin deaktiviert und es lief dann auch komischerweise wieder. Da ich aber nicht ohne meine Plugins leben wollte, habe ich nach einer anderen Lösung gesucht und bin auch fündig geworden: Browser Cache leeren. Klingt simple? Ist es auch. Hat zumindest jemanden im WP Forum und mir geholfen. (Mehr erfahren)

Block Lab und ACF

Dann hatte ich mich mit ACF beschäftigt. Wir haben für eine Kundin eine Website erstellt, die sich eigentlich perfekt für den Block Editor eignen würde, wir diese aber mit ACF umgesetzt haben, einfach weil wir uns damit auskennen. Ich hatte trotzdem nach Alternativen gesucht, die einem das Erstellen von Blöcken erleichtern. Vorerst fündig, bin ich bei Block Lab geworden.

Sobald das Plugin wiederholbare Felder und Uploads unterstützt, werden wir wahrscheinlich dahin wechseln, einfach weil ACF in Kombination mit dem Block Editor nicht mehr zeitgemäß ist. Wenn ACF auf Blöcke wechseln würden, wäre das natürlich eine ganz andere Geschichte, dass dies aber passiert, bezweifele ich, leider.

Inline Code im Block Editor hervorheben

Mit dem neuem Block Editor (Gutenberg) sind zahlreiche Möglichkeiten erschienen, seinen Beitrag schick zu machen. Was aber natürlich wieder fehlt, ist der <code> Block bzw. der Button um Code innerhalb von Text hervorzuheben. Falls du nach einem Plugin suchst, hilft dir vielleicht auch dieses hier schon weiter: Klick mich

WooCommerce Ajax Events

Auf der Seite einer unseren Kunden, gab es das Problem mit Salient, dass der „Jetzt Bestellen“ Button nicht mehr funktionierte. Das Problem ist nur, dass es in WooCommerce zisch Javascript-Events gibt, die im Formular irgendwas aktualisieren. Damit das eigene JS funktioniert, muss man also das richtige Event ansteuern. Wem das zu viel Arbeit ist, hilft daher vielleicht schon dieser Schnipsel:

$( document ).ajaxComplete(function( event, xhr, settings ) {
  // hier deine scripte einfügen
});Code-Sprache: JavaScript (javascript)

Wichtig ist nur, dass du vorher auch prüfst, dass sich die Aktionen im WooCommerce Formular befinden, damit sie nicht auf jeder Seite ausgeführt werden.

WordPress und das Problem mit Gmail

Seit einigen Monaten gibt es Probleme mit WordPress und Gmail. Emails werden scheinbar nicht nach Gmail versendet, oder landen direkt im Spam-Ordner. Das Problem lässt sich schnell und einfach mit dem Plugin WP Mail SMTP lösen. Das Plugin schreibt die wp_mail() um und bietet außerdem Möglichkeiten, seinen eigenen SMTP einzutragen, der dann anstelle von PHP mail() verwendet wird.

Fertige Installationen bspw. über All-Inkl (Partnerlink) installieren das Plugin direkt vor. Selbst wenn du keine Probleme hast, kann ich das Plugin empfehlen

Eigener Post Status in WordPress

Dann gab es wieder das leidige Thema, mit eigenem Post Status in Beiträgen und Beitragstypen. WordPress hat es bisher ja noch nicht geschafft, dafür eine ordentliche Funktion bzw. Filter einzubauen. Wer also einen Post Status hinzufügen muss, weil er neben der Standard-Status noch welche benötigt, könnte mit folgenden Schnipseln bedient sein:

new MyCustomStates;

class MyCustomStates {

  // hier werden die status zwischengespeichert
  public $states;

  // hier kannst du den post type festlegen, indem die status
  // dargestellt werden
  public $post_types = [ 'post' ];

  // wird direkt mit der klasse ausgeführt
  public function __construct() 
  {
    // hier setzen wir die status
    $this->set_states();    
    
    add_action( 'init', [$this, 'register_states'], 0 );    
    add_action( 'admin_footer-edit.php', [$this, 'register_overview_status_select'], PHP_INT_MAX );    
    add_filter( 'display_post_states', [$this,'display_overview_status'] );
    add_action( 'admin_footer', [$this, 'display_edit_status'], PHP_INT_MAX );
  }

  // hier werden die status festgelegt
  // wenn du den code hier verwenden möchtest, musst du
  // eigentlich nur hier deine status festlegen
  public function set_states() 
  {
    $states = [];

    // einfach kopieren und befüllen
    $states['test'] = [
      // das label in auswahlmenüs
      'label' => _x( 'Test', 'Status General Name', 'textdomain' ),
      // für die ausgabe in der übersicht (die anzahl)
      'label_count' => _n_noop( 'Test (%s)',  'Tests (%s)', 'textdomain' ),
    ];

    // noch ein beispiel
    $states['test2'] = [
      'label' => _x( 'Test2', 'Status General Name', 'textdomain' ),
      'label_count' => _n_noop( 'Test2 (%s)',  'Tests2 (%s)', 'textdomain' ),
    ];

    // hier speichern wir die status in die variable von oben
    $this->states = $states;
  }

  // hier werden unsere status registriert
  public function register_states()
  {
    // hier holen wir uns die vorher festgelegten status
    $states = $this->states;

    if( is_array($states) ) {
      foreach($states as $status_id => $status) {

        // hier können optionen festgelegt werden
        $args = [
          'public' => true,
          'show_in_admin_all_list' => true,
          'show_in_admin_status_list' => true,
          'exclude_from_search' => true,
        ];

        // hier werden unsere festgelegten werte eingetragen
        $args['label'] = $status['label'];
        $args['label_count'] = $status['label_count'];

        // hier registrieren wir unseren status, mit der von uns
        // festgelegten id
        register_post_status( $status_id, $args );
      }
    }    
  }

  // ist notwendig, damit der status in der beitragsübersicht 
  // ausgewählt werden kann
  public function register_overview_status_select()
  {
    // hier holen wir uns die vorher festgelegten status
    $states = $this->states;

    if( is_array($states) ) {

      $options = '';
      
      foreach($states as $status_id => $status) {
        $options .= "$('select[name=\"_status\"]').append( '<option value=\"$status_id\">".$status['label']."</option>' );";
      }

      echo "<script>(function($){".$options."})(jQuery)</script>";
    }    
  }

  // hier wird die die ausgabe für den status in der
  // beitragsübersicht registriert
  public function display_overview_status($wp_states)
  {
    // hier holen wir uns die vorher festgelegten status
    $states = $this->states;

    if( is_array($states) ) {
      foreach( $states as $status_id => $status ) {      
      	if( get_query_var( 'post_status' ) != $status_id ) {
          if( $post->post_status == $status_id ) {
            return [ $status['label'] ];
      		}
      	}        
      }
    }
    
  	return $wp_states;
  }

  // hier wird die ausgabe für die bearbeitung innerhalb
  // von beiträgen festgelegt
  public function display_edit_status()
  {
    global $post;

    $complete = '';
    $label = '';

    // prüft ob der aktuell post type einem unserer
    // festgelegten post types entspricht
    if( !in_array($post->post_type, $this->post_types) ) {
      return;
    }

    // hier holen wir uns die vorher festgelegten status
    $states = $this->states;
  
    if( is_array($states) ) {

      $wp_states = get_post_statuses();      
      $label = $wp_states[$post->post_status];

      echo '<script>(function($) {';      
      echo '$(function() { $("#post-status-display").text("'.$label.'"); });';
      
      foreach( $states as $status_id => $status ) { 

        // wenn der aktuell gesetzt post status mit
        // $status_id übereinstimmt, dann selectiere die option
        // im select
        if($post->post_status == $status_id) {
          
          $label = $status['label'];
          echo '$("#post_status").append("<option value=\"'.$status_id.'\" selected>'.$label.'</option>");';
          echo '$(".misc-pub-section.misc-pub-post-status").find("label").append("<span id=\"post-status-display\"> '.$label.'</span>");';
        }

        // wenn nicht, dann tue das nicht
        else {          
          $label = $status['label'];
          echo '$("#post_status").append("<option value=\"'.$status_id.'\">'.$label.'</option>");';
        } 
        
      }
            
      echo '})(jQuery)</script>';
    }  
  }  
}Code-Sprache: PHP (php)

Wichtig: Im Block Editor werden die neuen Status nicht angezeigt. Zumindest wurden sie das bei mir nicht.


Das war meine Woche im Schnelldurchlauf. Die nächsten zwei Wochen wird es wahrscheinlich nicht viel von mir zu Hören geben, weil wir „Urlaub“ haben. Daher wünsche ich an dieser Stelle schöne Festtage und einen guten Rutsch ins neue Jahr.

In