2

ユーザーの「悪臭」のおかげで、これは解決されました。以下の元の質問と私の観察を参照してください-選択した回答までスクロールしても意味がありません

元の質問

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 が使用する短い構文のファンではありません

4

1 に答える 1

1

必要なのはis author コンディショナルタグです。

このコンディショナル タグは、作成者のアーカイブ ページが表示されているかどうかを確認します。これはブール関数で、TRUE または FALSE を返します。

条件を single.php に追加します。必要に応じて、同じファイルに別のループを追加するか、条件が満たされている場合はcustom-single.phpに切り替えます

編集: これは、カスタム投稿タイプのコードを生成するのに最適なサイトです。

于 2013-11-11T07:37:07.100 に答える