web-dev-qa-db-ja.com

誤ったオブジェクトを返すグローバル変数$ post

私のheader.phpファイルでは、現在のページのスラッグを取得して、WooCommerce Products Archive/shopページであることを確認しようとしています。私は この 似た質問の答えに従いましたが、役に立ちませんでした。現在のページのスラッグが返される代わりに、最初に販売されたスラッグが表示されたアイテムが返されました。私の質問はこれらです:

  • $post->post_nameが正しいshopではなくtest-product-magazineを返すのはなぜですか?

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

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

正しいshopではなくtest-product-magazineが必要なのはなぜですか?

大域的な$postオブジェクトはアーカイブページについて何かを決定するための信頼できる方法ではありません。なぜなら、オブジェクトは通常ループの外側でメインクエリの最初の投稿になるからです。主なクエリはアーカイブ内の投稿であり、アーカイブ自体ではないため(通常はページではありません)、$postオブジェクトは存在している可能性のあるページを表しません。アーカイブに使用されます。

これは、ショップページとブログページが実際には表示されていないためです。そのため、グローバルタグオブジェクトをテンプレートタグに設定する必要はありません。タイトルのように、使用されるページの一部は、the_title()を使用してグローバル投稿オブジェクトから取得されるのではなく、データベース内のページのIDによって直接取得されます。 WooCommerceのしくみの例については、 woocommerce_page_title() の以下の行を参照してください。

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

そしてPostsページの場合、WordPressはそのページに対してグローバルな$postオブジェクトを使用することはなく、照会されたページ名がデータベースに設定されているpostsページであるかどうかをチェックし、それに従ってクエリを修正します。

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;
}

そのため、ShopページとPostsページを取得する正しい方法は、適切な条件関数を使用してから、関連IDのデータベースを確認し、それを使用して必要な情報を取得することです。 Shopページの場合は、次のようになります。

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;
}

投稿ページの場合は、次のようになります。

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;
}

WooCommerce Products Archive/shopページ用のカスタムページテンプレートを作成する方法を教えてください。

これはここでは話題になっていません(おそらく最初の質問もそうでしたが、投稿ページへの関連性も私は答えを正当化したと思います)、しかしあなたが問題について WooCommerceドキュメントを見れば

WooCommerceテンプレートファイルには、フロントエンドおよびHTML電子メール用のマークアップおよびテンプレート構造が含まれています。あなたのお店の.

...

テンプレートファイルは/woocommerce/templates/ディレクトリ内にあります。

...

これらのファイルは、オーバーライドを使用して、アップグレードセーフな方法で編集できます。同じファイル構造を維持しながら/woocommerceサブディレクトリを削除して、テーマ内の/templates/という名前のディレクトリにコピーします。

あなたが質問している関連ファイルはwoocommerce/templates/archive-product.phpです。しかし、これはcategory/tag/etcにも使用されることに注意してください。アーカイブ。ショップページ(そしてショップページのみ)を異なるものにしたい場合は、テンプレート内のis_shop()をチェックし、それに応じて異なるマークアップを出力する必要があります。

1
Jacob Peattie