私はproductpopupsと呼ばれるカスタム投稿タイプを持っています、そしてそれらを分類するために私はproductcategoryと呼ばれるカスタム分類学を持っています。投稿タイプには独自の特別なテンプレート(single-productpopup.php)があり、各商品カテゴリをそのカテゴリへのリンクで表示しようとしています。私が抱えている問題は次のとおりです。
各製品カテゴリへのリンクはexample.com/productcategory/category
ですが、リンク先のページは実際にはexample.com/category
です。
だから私はこれを作りました:
<p>Categories:
<?php
$categories = get_the_terms( $post->ID, 'productcategory' );
foreach( $categories as $category ) {
echo '<a href="http://example.com/'.$category->slug.'">'.$category->name.'</a>, ';
}
?>
</p>
これは、私が設定したページがproductcategoryと同じスラッグを使用しているためにうまくいきますが、そのハッキーと1つのスリップ(タイプミスのような)はそれを壊すでしょう。
私がやりたいことは私がページのURLを指定することができ、それからhttp://example.com/.$category->slug
の代わりにそれを呼び出すことができる分類法にカスタムフィールドを追加することです。
これは可能ですか?
追加の説明のために編集しなさい: それがURLであるという事実を忘れて、私はデータを入力することができ、製品ごとに照会できるフィールドが必要です。見つけられた。たとえば、製品Aには1つと2つの2つのカテゴリがあるとします。このようなテーブルを作成できます。
+-----------+----------+--------------+
| Name | Category | Custom Value |
+-----------+----------+--------------+
| Product A | C 001 | CV 001 |
+-----------+----------+--------------+
| Product A | C 002 | CV 002 |
+-----------+----------+--------------+
私が問題を解決するためについに思いついたコード!
<?php
global $wpdb;
$catresult = array();
$postid = get_the_ID();
$query1c = "SELECT wp_posts.ID, wp_terms.`name` AS `Category`, wp_pods_productcategory.`pc-url` AS `Url`
FROM wp_posts
INNER JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
INNER JOIN wp_terms ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id
LEFT OUTER JOIN wp_pods_productcategory ON wp_pods_productcategory.id = wp_term_relationships.term_taxonomy_id
INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_id
WHERE wp_term_taxonomy.taxonomy = 'productcategory' AND wp_posts.ID =$postid
ORDER BY wp_terms.`name` ASC";
$categories = $wpdb->get_results( $query1c );
foreach ( $categories as $category )
{
array_Push( $catresult, "<a href='".$category->Url."'>".$category->Category."</a>" );
}
echo implode(', ', $catresult);
?>
それで、これはどのように機能しますか?
<?php
これは開始タグであるため、サーバーは次に来るものがphp
であることを認識します。
global $wpdb
ここで、WordPressデータベースに接続することをサーバーに伝えます。
$catresult = array();
ここでデータを格納するために使う配列を作成します。
$postid = get_the_ID();
ここで、クエリをフィルタリングできるように投稿IDを取得します。
$query1c = "SELECT....
ここで、wp_term_taxonomy.taxonomy = 'productcategory'
とwp_posts.ID =$postid
(これは、前からの$postid
を使用する場所です)でフィルター処理し、wp_terms.name ASC
の順に並べ替え、必要なフィールドを選択するクエリを配置します。
$categories = $wpdb->get_results( $query1c )
これはクエリを実行し、生データを$categories
に保存します。
生データを使用可能なものに変換する必要があります。生データは現在$categories
として保存されていますが、それぞれの結果が個別に必要になるので、次のように入力します。
foreach ( $categories as $category)
ここで一つの結果が$category
として知られるようになる
array_Push( $catresult, "<a href='".$category->Url."'>".$category->Category."</a>" )
ここで、それぞれの結果を先に作成した配列に個別に 'プッシュ'します - $catresult
。それぞれの結果はそのリンク(<a>
タグ)で準備されています。
最後に、これらのカテゴリーをリストに入れたいので、コンマで区切ったほうが見栄えがよくなります。そう:
echo implode(', ', $catresult)
それではここで配列を「分解」します。これは配列の各結果の間に何かを入れることを意味します。この場合はコンマとそれに続くスペースです。これはecho
コマンドを使用してページに印刷されます。
最後に?>
は、このphp
セクションを閉じるようにサーバーに指示します。
遅くパーティーに来てすみません。これが私の解決策です
<?php
//Retrieve the terms in productcategory taxonomy with posts (not empty)
$terms = get_terms( array ( 'taxonomy' => 'productcategory', 'hide_empty' => false, 'parent' => 0, 'orderby' => 'description', 'order' => 'ASC' ));
//loop through each term to get its attributes
foreach ($terms as $term) {
//Uncomment below code to see all the available attributes.
//var_dump($term);
//die();
$name = $term->name;
//PHP -> Store the link in variable to reuse
//to get the link for the the particular term; you need to have the slug and pass it into the get_term_link() function.
//the second argument is the taxonomy name in this case productcategory.
$cat_link = get_term_link( $term->slug, 'productcategory' );
?>
<a href="<?php echo $cat_link; ?>"><?php echo $name; ?></a>
<?php
}
?>
自分で分類法を作成した場合は、カスタム分類法に独自のスラグを設定できます。例えば:
register_taxonomy(
'productcategory',
array(
'productpopups',
),
array(
'labels' => array(
'name' => __('Categories', 'text-domain'),
),
// --- set taxonomy slug ---
'rewrite' => array(
'slug' => '%productcategory%', // set taxonomy slug
'with_front' => false, // set this to false
)
// -------------------------
)
);
flush_rewrite_rules(); // <-- don't forget to add this line of code!