web-dev-qa-db-ja.com

カスタム投稿タイプの作者のためのthe_author_posts_link()

ブログには通常のブログ投稿とカスタム投稿タイプの両方があります。ページテンプレートに著者投稿リンクが表示されます。投稿を投稿した著者のリンクをクリックすると、そのページ(blog/authors/mr-author)に予想されるバイオ情報と投稿者の投稿のリストが表示されます。

ただし、作成者ではあるがカスタムの投稿タイプのみを作成し、通常の投稿は作成していないユーザーを作成した場合、the_author_posts_link()によって生成されたリンク(まだ正しいリンク:blog/authors/mr-author)未記入のページを表示します(つまり、フィールドはすべて空で、投稿リストはすべての投稿者の全投稿の完全なリストです)。

明らかに、$ authordataグローバル内で正しいデータを取得していません。しかし、なぜ? author.phpget_the_author_meta('display_name')のような標準的なテンプレートタグを使って作者情報を表示していますが、これはすべて投稿がない作者にとって空白の結果を示しています。

私は現在、$ authordataが存在している特定の投稿タイプにリンクされているかどうかを確認するために$ authordataがどこでいつ追加されるかを調べるためにコアを掘り下げています。誰もが前にこれに遭遇しますか?

編集:チップの答えに基づく解決策

add_action('pre_get_posts', 'hdb_add_custom_type_to_query');

function hdb_add_custom_type_to_query( $notused ){
     if (! is_admin() ){
        global $wp_query;
        if ( is_author() || is_home() ){
            $wp_query->set( 'post_type',  array( 'post', CUSTOM_TYPE ) );
        }
     }
}

おそらくカスタム投稿タイプを宣言するときなどに、CUSTOM_TYPE定数を定義したとします。

5
Tom Auger

私は問題はデフォルトのクエリがpost post-typeのみをクエリすることだと私は信じています。 ( 関連するWPSE質問はこちらを参照

そのため、おそらくauthor.phpテンプレートファイルのクエリを変更して、関連するすべての投稿タイプがクエリに含まれるようにする必要があります。

4
Chip Bennett

そのためのより簡単な方法は、新しい投稿を登録しながら、カスタム投稿タイプに作成者のサポートを追加することです。

'supports' => array(
                        'title',
                        'editor',
                        'thumbnail',
                        'post-formats',
                        'author', 
                        ),
1
c24b

この回避策で問題は解決しましたが、少し汚れています。私たちが投稿グローバルにthe_post()を入れるとき、それは実際の '投稿'を考慮に入れるだけであるという事実でChipがお金を使っていると思います、それ故に$ authordataグローバルは埋められていません。

奇妙なことに(あるいはそうではないですが、深層の内部構造を本当に調べているのであれば、私はまだ考えていません)get_queried_object()は$ authordataとまったく同じ構造を返します。それでauthors.phpに挿入された次のスニペットは私が望んだことを達成します。明らかにこれは作者のアーカイブテンプレートページで期待通りに動作するだけです、そうでなければget_queried_object()は他の何らかの構造体を返します。

<?php 
  the_post(); // Attempt to populate post globals (works if this author has regular posts)

  global $authordata;
  if ( !is_object( $authordata ) ) $authordata = get_queried_object(); 
?>

私がこれについてさらに考えるように、著者データを移入するためのデフォルトの方法は実際には欠陥があるようです。著者の投稿のリストを取得し、リストの最初の投稿に基づいて、(再)投稿者データを入力します。私のアプローチが優れている、あるいは優れていると言うつもりはありませんが、私はこのページで主に照会されるオブジェクトとして著者オブジェクトを扱うという考えが好きです。照会された用語との循環関係のためにページ。

1
Tom Auger

どのユーザーにも投稿がない場合、デフォルトで404が表示されます。そのユーザーのuser_idは$author変数から取得できます。その後、ユーザーの投稿やその他の種類のものを必要に応じて入力できます。

0
Tareq

私は最近 "投稿"のないサイトでこれをしなければなりませんでした、それはまだ著者ページを必要としました。

基本的にあなたはtemplate_redirectフックで作者ページを捉え、404フラグを確実に解除し、そして作者テンプレートを含めます。必要に応じてテンプレートリダイレクトテスト内のロジックを拡張できます。その後、author.phpテンプレートで何をするかはあなた次第です。

/* Force author views to use author.php, rather than default to 404 pages 
    if there are no posts to show. */
add_action( 'template_redirect', 'author_page_template' );

function author_page_template() {

    // Note: you probably also want to check if the author exists...
    if ( is_author() ) {
        global $wp_query;
        $wp_query->set( 'is_404', false );
        include( get_stylesheet_directory().'/author.php' );
        exit;
    }

}
0
goldenapples