ユーザーの「悪臭」のおかげで、これは解決されました。以下の元の質問と私の観察を参照してください-選択した回答までスクロールしても意味がありません
元の質問
wordpress 用のカスタム投稿タイプ プラグインを作成していて、ここで立ち往生しています。
現在、管理者側ではすべてが正常に機能していますが、フロントエンドでは /type/title などのページしかレンダリングできません。
私が本当に欲しいのは、/type/author/AUTHORNAME (例: /games/author/myuser) のような URL を介して特定の作成者に関連付けられた投稿のリストです。
書き換えルールを設定しました:
public static function rewrite_rules(&$wpr) {
$key = self::$postType.'/author/(.+)';
$rewrite = 'index.php?author=$matches[1]&post_type=$matches[2]';
$newRules = Array($key => $rewrite);
$wpr->rules = $newRules + $wpr->rules;
//echo "<pre>"; print_r($wpr->rules);
//flush_rewrite_rules();
}
add_filter('generate_rewrite_rules', array(get_class(), 'rewrite_rules'));
(残りのクラスは表示されません)
そして、template_include フィルターに追加するのと同じくらい簡単だと思いました。
/type/author/AUTHORNAME にアクセスしようとすると、WP は archive.php にアクセスします。
public static function template_include($path) {
if (get_post_type() == self::$postType) {
if (is_single()) {
if ($theme_file = locate_template(array('single-gamesdb.php'))) {
$path = $theme_file;
} else {
$path = RGPDB_ROOT.'/templates/single-gamesdb.php';
}
} elseif (is_author()) {
echo "!!!"; exit;
if ($theme_file = locate_template(array('author-gamesdb.php'))) {
$path = $theme_file;
} else {
$path = RGPDB_ROOT.'/templates/author-gamesdb.php';
}
} elseif (is_archive()) {
$path = RGPDB_ROOT.'/templates/author-gamesdb.php';
}
} else {
if (is_archive()) {
$type = get_query_var('post_type');
echo "!!!! $type";
}
}
//echo $path;
return $path;
}
template_include の最初の部分が機能します - /games/some-game-title は single-gamesdb.php にアクセスし、問題なくレンダリングします。
WP は、 if (is_archive()) { ... } が単独である下部セクションに到達しますが、クエリ文字列からどの投稿タイプを持っているかわかりません。query_vars フィルタを調べると、post_type= と author= が完全に有効であることがわかりますが、これは著者ではなくアーカイブ ページとして認識されています。
作成者ページをカスタム投稿タイプに直接添付できると思っていたので、カスタム投稿タイプの設定について何か不足していますか?
解決
私が見つけたのは、 register_post_types() 呼び出しが完全に正しく構成されていないことでした。悪臭が下にあるリンクを使用して、PHP の構築を支援することをお勧めしますが、いくつかの落とし穴があります。
カスタム投稿タイプの投稿を特定のユーザーにのみ表示するカスタムパーマリンクが必要で、適切なパターンでデザインを分離したい場合は、2 つの追加手順を実行する必要があります。
1) かなり簡単なカスタムの書き換えを追加する必要があります。
function my_rewrite_rules(&$wpr) {
$key = 'mypostype/author/([a-zA-Z0-9]+)';
$rewrite = 'index.php?post_type=myposttype&author_name=$matches[1]';
$newRules = Array($key => $rewrite);
$wpr->rules = $newRules + $wpr->rules;
}
add_filter('generate_rewrite_rules', 'my_rewrite_rules);
$wpr
上記は単なる短縮$wp_rewrite
ですが、参照渡しであることを覚えておいてください。最初に & が必要です
2) テーマの author.php ファイルをハックしてカスタム デザインを追加したいだけの場合は、それを行うことができます。これは、そのままpost_type
で既に登録されている変数ですauthor_name
。そこにロジックを追加するだけです。いくつかの理由で私が必要としていたような完全に別のページが必要な場合は、template_include
フックに追加する必要があります。
function my_template_include($path) {
if (get_post_type() == 'myposttype') {
if (is_author()) {
if ($theme_file = locate_template(array('author-myposttype.php','author.php'))) {
$path = $theme_file;
} else {
$path = plugin_dir_path(__FILE__).'/templates/author-gamesdb.php';
}
}
}
}
add_filter('template_include', 'my_template_include');
locate_template() 呼び出しは、標準階層内の子テーマ、テーマなどを検索して、配列内のそれらのファイルの 1 つを見つけようとします (例: author-myposttype.php および author.php)。
ガッチャ
作成者ページを取得したいユーザーに投稿が割り当てられていない場合、カスタム作成者ページまたは基本ページが表示されず、何らかの理由で archive.php になります。
例: http://mywebsite.com/myposttype/author/someauthorname
このカスタム投稿タイプの投稿者 'someauthorname' に投稿を割り当てると、author-myposttype.php または author.php に移動しますが、その人が作成した投稿がない場合、そこには行きません。
リライトで既知の変数を設定すると、ほとんどのパラメーターを使用して WP_Query オブジェクトが自動的に作成され、標準のループを実行するだけで済みます。
if (have_posts()) {
while (have_posts()) {
the_post();
..... your display code ....
}
}
私は、コロンと endwhile/endif を使用してデフォルトで WP が使用する短い構文のファンではありません