Die globale Variable $ post gibt ein falsches Objekt zurück

In meiner Datei ” header.php ” habe ich versucht, den Slug der aktuellen Seite zu finden, um die WooCommerce Products Archiv / Shop-Seite zu überprüfen. Ich folgte der Antwort dieser ähnlichen Frage ohne Erfolg; anstelle des aktuellen Slugs der aktuellen Seite wurde der erste Item, der verkauft wurde, zurückgeschickt. Meine Fragen sind diese:

  • Warum gibt $post->post_name test-product-magazine , anstatt den richtigen shop ?

<img src="http://img.daswordpress.com/php/BtGb5.png" alt=" test-product-magazine anstelle des richtigen shop “>

 post_name; ?> 

Solutions Collecting From Web of "Die globale Variable $ post gibt ein falsches Objekt zurück"

Warum ist das test-product-magazine statt der richtigen?

Das globale $post Objekt ist keine zuverlässige Methode, um etwas über Archivseiten zu ermitteln, da das Objekt normalerweise außerhalb der Schleife der erste Post der Hauptabfrage ist. Da die Hauptabfrage für die Posts im Archiv und nicht für das Archiv selbst gilt (was normalerweise nicht einmal eine Seite ist), repräsentiert das $post Objekt keine Seite, die möglicherweise für das Archiv verwendet wird.

Dies liegt daran, dass die Shop-Seite und die Blog-Seite nicht angezeigt werden. Sie müssen also nicht das globale Post-Objekt für Vorlagen-Tags festlegen. Die Bits der Seiten, die wie der Titel verwendet werden, werden nicht mit the_title() aus dem globalen Post-Objekt gezogen, sondern direkt von der ID für die Seite in der database. Sehen Sie diese Zeilen von woocommerce_page_title() für ein Beispiel, wie WooCommerce es macht:

 $shop_page_id = wc_get_page_id( 'shop' ); $page_title = get_the_title( $shop_page_id ); 

Und für die Posts-Seite verwendet WordPress niemals das globale $post Objekt für diese Seite, es prüft nur, ob der abgefragte Seitenname die Posts-Seite ist, wie sie in der database eingestellt ist, und modifiziert die Abfrage entsprechend:

 if ( 'page' == get_option('show_on_front') && isset($this->queried_object_id) && $this->queried_object_id == get_option('page_for_posts') ) { $this->is_page = false; $this->is_home = true; $this->is_posts_page = true; } 

Der richtige Weg, um die Shop-Seite und die Posts-Seite zu bekommen, besteht darin, die entsprechenden bedingten functionen zu verwenden, dann die database nach der relevanten ID zu durchsuchen und diese zum Abrufen von beliebigen Informationen zu verwenden. Für die Shop-Seite wäre das:

 if ( is_shop() ) { $shop_page_id = wc_get_page_id( 'shop' ); $shop_page_object = get_post( $shop_page_id ); // echo $shop_page_object->post_name; } 

Und für die Posts-Seite wäre das:

 if ( is_home() && ! is_front_page() ) { $posts_page_id = get_option( 'page_for_posts' ); $posts_page_object = get_post( $posts_page_id ); // echo $posts_page_object->post_name; } 

Wie kann ich eine benutzerdefinierte Seitenvorlage für die WooCommerce-Produkte Archiv / Shop-Seite erstellen?

Das ist hier off Thema (die erste Frage war wahrscheinlich auch, aber seine Relevanz für die Posts Seite auch denke ich, eine begründete Antwort), aber wenn Sie sich die WooCommerce-Dokumentation zu dem Thema ansehen:

WooCommerce-Vorlagendateien enthalten die Markup- und Vorlagenstruktur für Frontend- und HTML-E-Mails Ihres Geschäfts.

Vorlagendateien finden Sie im /woocommerce/templates/ :

Sie können diese Dateien mithilfe von Außerkraftsetzungen upgrade-sicher bearbeiten. Kopieren Sie es in ein Verzeichnis innerhalb Ihres Themas namens /woocommerce wobei Sie die gleiche Dateistruktur /woocommerce , aber das Unterverzeichnis /templates/ entfernen.

Die relevante Datei, nach der Sie fragen, ist woocommerce/templates/archive-product.php . Beachten Sie, dass dies auch für Kategorie / Tag / etc verwendet wird. Archiv. Wenn Sie möchten, dass die Shop-Seite – und nur die Shop-Seite – anders is_shop() , müssen Sie in der Vorlage is_shop() überprüfen und entsprechend unterschiedliche Auszeichnungen ausgeben.