私のheader.php
ファイルでは、現在のページのスラッグを取得して、WooCommerce Products Archive/shopページであることを確認しようとしています。私は この 似た質問の答えに従いましたが、役に立ちませんでした。現在のページのスラッグが返される代わりに、最初に販売されたスラッグが表示されたアイテムが返されました。私の質問はこれらです:
$post->post_name
が正しいshop
ではなくtest-product-magazine
を返すのはなぜですか?<?php
global $post;
echo "post_name: " . $post->post_name;
?>
正しい
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()
をチェックし、それに応じて異なるマークアップを出力する必要があります。