it-swarm.com.de

Globale Variable $ post gibt falsches Objekt zurück

In meiner header.php-Datei habe ich versucht, den Slug der aktuellen Seite abzurufen, um zu überprüfen, ob es sich um eine WooCommerce-Produktarchiv-/Shop-Seite handelt. Ich folgte der Antwort dieser ähnlichen Frage, ohne Erfolg; Anstatt den Slug der aktuellen Seite zurückzugeben, wurde der erste verkaufte Slug zurückgegeben. Meine Fragen sind diese:

  • Warum gibt $post->post_nametest-product-magazine anstelle der korrekten shop zurück?

<code>test-product-magazine</code>, instead of the correct, <code>shop</code>

<?php 
    global $post;
    echo "post_name: " . $post->post_name;
?>
1
ratskin

Warum ist test-product-magazine anstelle der korrekten shop?

Das globale $post -Objekt ist keine zuverlässige Methode, um Informationen zu Archivseiten zu erhalten, da das Objekt normalerweise der erste Beitrag der Hauptabfrage ist, wenn es sich außerhalb der Schleife befindet. Da sich die Hauptabfrage auf die Posts im Archiv bezieht und nicht auf das Archiv selbst (das normalerweise nicht einmal eine Seite ist), repräsentiert das $post-Objekt keine Seite, die möglicherweise vorhanden ist für das Archiv verwendet.

Dies liegt daran, dass die Shop-Seite und die Blog-Seite nicht angezeigt werden. Daher muss das globale Post-Objekt nicht für Vorlagen-Tags festgelegt werden. Die Bits der verwendeten Seiten, wie der Titel, werden nicht mit the_title() aus dem globalen Post-Objekt abgerufen, sondern direkt von der ID der Seite in der Datenbank. In diesen Zeilen aus woocommerce_page_title() finden Sie ein Beispiel für die Funktionsweise von WooCommerce:

$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 in der Datenbank festgelegt, und ändert 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 abzurufen, besteht darin, die entsprechenden bedingten Funktionen zu verwenden, dann die Datenbank auf die relevante ID zu überprüfen und diese zum Abrufen der gewünschten 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 Archiv-/Shopseite von WooCommerce-Produkten erstellen?

Dies ist hier kein Thema (die erste Frage war wahrscheinlich auch, aber die Relevanz für die Posts-Seite ist meiner Meinung nach gerechtfertigt), aber wenn Sie sich die WooCommerce-Dokumentation zu diesem Thema ansehen :

WooCommerce-Vorlagendateien enthalten die Markup- und Vorlagenstruktur für Frontend- und HTML-E-Mails von Ihrem Geschäft.

...

Vorlagendateien befinden sich im Verzeichnis /woocommerce/templates/:

...

Sie können diese Dateien auf aktualisierungssichere Weise bearbeiten , indem Sie Überschreibungen verwenden. Kopieren Sie es in ein Verzeichnis in Ihrem Design mit dem Namen /woocommerce, wobei Sie die gleiche Dateistruktur beibehalten, aber das Unterverzeichnis /templates/ entfernen.

Die relevante Datei, nach der Sie fragen, ist woocommerce/templates/archive-product.php. Beachten Sie jedoch, dass dies auch für category/tag/etc verwendet wird. Archiv. Wenn Sie möchten, dass die Shop-Seite - und nur die Shop-Seite - unterschiedlich ist, müssen Sie in der Vorlage is_shop() überprüfen und ein anderes Markup entsprechend ausgeben.

1
Jacob Peattie