私はビデオゲームのニュースブログを運営しています。私のスタッフがニュース記事やレビューを書くとき、私は彼らにその記事をゲームに「割り当てる」ことができるようにしたいのですが(該当する場合)、そのためsingle.phpテンプレートでそのゲームの情報を呼び出すことができます。ボックスアート、出版社、発売日など)を入力してサイドバーに表示します。私はこれがカスタムの分類法を含んでいてタグのように投稿に割り当てることができるかもしれないと考えた。
しかし、それから私は私もそれらのゲームに情報が満載の全ページを持って欲しいと思いました。私は当初、ページのカスタム投稿タイプを作成することを考えていました。カスタムフィールドを使用して、ゲームのボックスアートを呼び出し、リリース日を表示します。ゲームの発行者、開発者などを表示します。
そして、私はそれらの出版社や開発者にも自分たちのページを持って欲しいと思いました。説明、場所、それらに関連する記事へのリンク、それらに起因するすべてのゲームのリストなど。
開発者は常に特定の発行者に固定的に結び付けられているわけではないため、ゲームは複数の関係者によって共同開発されることもあります。
私は漬け物に入っている、そして私のサイトを再編成する方法を理解することはできません。 WP自分でできることを制限するのではなく、必要なサイトを作成するためにWordPressのすべての新しい玩具を本当に使用したいです。助言がありますか?私は何か考え出すために何日もブレインストーミングをしています。任意の提案は大歓迎です。
これにはいくつかの選択肢があります。私はあなたがしてきたプロセスにもかかわらず、私は実際に同じことを経験しました。 Wordpressがあなたに投稿またはカスタム投稿タイプを一緒にリンクさせてくれるのであれば簡単ですが、その代わりに、Wordpress開発者のハッカーが発生するはずです。
私が取り組んでいるプラグインで私が行った解決策は少し厄介です、しかしそれは私のために働きます。基本的に私のプラグインで、私は特定のテレビシリーズに関する情報を保持するseriesと呼ばれる投稿タイプ、エピソード用の投稿タイプ、そしてDVDとBlu-rayリリース用の別の投稿タイプが欲しいと思いました。エピソードとリリースの投稿タイプの両方で、それらが由来するシリーズの種類を参照するようにしたかったので、単一のシリーズ投稿ページを作成すると、エピソードとリリース、およびシリーズ情報を一覧表示できます。
私の解決策はシリーズのオブジェクトIDを保持するカスタムフィールドを含みます。これを実現するための最初の方法は、タイプシリーズのすべての投稿の選択ボックスを持つメタボックスを作成することでした。
public function get_select_array($post_type) {
global $wpdb;
$query = "SELECT ID, post_title FROM $wpdb->posts WHERE post_type = '$post_type' AND post_status = 'publish' ORDER BY post_title";
$results = $wpdb->get_results($query, OBJECT);
$series = array();
foreach ($results as $result) {
$series[] = array('name' => $result->post_title, 'value' => $result->ID);
}
return $series;
}
関数get_select_array()は基本的にカスタム投稿タイプを取り、配列で公開されているすべてのものの投稿タイトルとIDを返します。その配列を使用して選択ボックスに値を入力します。私のプラグインでは、Rilwisが作成したmetabox 作成クラスを使用しています しかし、使用するコードをいくつか投稿します(コードはRilwisのコードを基にしています)。
add_meta_box('parent_series', 'Series', 'show_series_metabox', 'episode', 'side', 'high'); //add a side metabox
function show_series_metabox() {
global $post;
echo '<input type="hidden" name="wp_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />'; //nonce
$series = get_select_array('series'); //get post titles and ID's of post type 'series
$meta = get_post_meta($post->ID, 'parent_series', true); //get the meta value of the custom field
echo '<select name="parent_series" id="parent_series">';//create the select box
foreach ($series as $s) {
echo '<option value="', $s['value'], '"', $meta == $s['value'] ? ' selected="selected"' : '', '>', $s['name'], '</option>';
}
echo '</select>';
}
add_action('save_post', 'save_series_metabox');
function save_series_metabox() {
$real_post_id = isset($_POST['post_ID']) ? $_POST['post_ID'] : NULL ; //get post id
$old = get_post_meta($real_post_id, 'parent_series', true); //get old stored meta value
$new = $_POST['parent_series']; //new meta value
if ($new && $new != $old) { //saving or deleting value
update_post_meta($real_post_id, 'parent_series', $new);
} elseif ('' == $new && $old) {
delete_post_meta($real_post_id, 'parent_series', $old);
}
}
これにより、利用可能なすべてのシリーズを一覧表示するselectを持つメタボックスが追加されます。投稿が保存されると、そのシリーズのIDは「parent_series」というカスタムフィールドに保存されます。それが完了したら、そのIDを呼び出し、それを使用してカスタムクエリを介してシリーズ情報を呼び出すことができます。あるいは、反対のことを行うこともできます。シリーズページで、カスタムフィールド/メタデータに同じ値を持つすべてのエピソードページに対してクエリを実行します。
そして、あなたはそれを持っています。このコードを使用して、ある種類の投稿を別の種類の投稿にリンクして、それらを擬似分類法のように機能させることができます。私はコードをかなり早く編集したので、もしあなたが何かエラーやバグを見つけたら、私に知らせてください。これを行うより良い方法があるならば、私に知らせてください:)