web-dev-qa-db-ja.com

Wp_get_archives()apply_filters()のオーバーライド

私はしばらくGoogledをしてきましたが、これを行う最良の方法がわからない。

wp-includes/general-template.phpでは、このコード行が含まれている関数wp_get_archives()を見ています。

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' AND post_status = 'publish'", $r );

私がやりたいことは

$where = apply_filters( 'getarchives_where', "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'", $r );

しかし、私はこのフィルタにフックしてfunctions.phpでそれを上書きする方法がわからない。

何かアドバイスは大歓迎です。

ありがとう、

イアン

2
Ian Jamieson

WordPressフィルタは、文字列、配列、またはオブジェクトを受け取り、何かを行い、filtered文字列、配列、またはオブジェクトを返す関数です。

だからあなたがやりたいことは"WHERE post_type = 'post' AND post_status = 'publish'""WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'"に変えることです。それはかなり簡単です。

見た目から、getarchives_whereフィルタは2つの引数を受け入れます。それで、あなたはそのようにフィルターに引っ掛かるでしょう:

add_filter( 'getarchives_where', 'my_fancy_filter_function', 10, 2 );

次に、2つのパラメータを受け取り、それらをフィルタ処理し、文字列を返す関数を作成する必要があります。

function my_fancy_filter_function( $text, $r ) {
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

これで、この関数は任意の入力を取り込みますが、alwaysは指定したフィルタの文字列を返します。より高度な方法でクエリパラメータを追加することができますが、これはあなたの質問が求めていることを正確に達成するでしょう。

4
EAMann

プラグインまたはテーマのfunctions.phpに、次のように書きます。

add_filter( 'getarchives_where', 'wpse_67264_filter_getarchives_where' );

/**
 * Add post type 'events' to wp_get_archives() query.
 * 
 * No parameters needed because we ignore them anyway.
 * 
 * @wp-hook getarchives_where
 * @return  string New WHERE clause
 */
function wpse_67264_filter_getarchives_where()
{
    return "WHERE post_type = 'post' OR post_type = 'events' AND post_status = 'publish'";
}

私の考えでは、これはカスタムのWP_Queryよりも優れています。テーマを使用していないため、コールバックでパラメーターを受け入れる必要さえありません。 :)

フィルタがどのように機能するかを理解するには、プラグインAPIの Codexをお読みください 。基本的に、コールバックの戻り値はapply_filters()の2番目の部分を置き換えます。

2
fuxia

実際にやりたいことはWP_Queryと呼ばれる組み込みのWordPressクラスを使うことです。このようにして、実際のWordPressのコア機能を変更することはありません(アップグレードするときには大きな頭痛の種になります)。

アーカイブページで、現在のループを次のようなカスタムクエリに置き換えます。

$args = array(); // setup the custom posts you want in here
$custom_query = new WP_Query($args); // build a custom query
while($custom_query->have_posts()) : $custom_query->the_post();
    // inside the loop, show your posts
endwhile;
wp_reset_postdata(); // reset the query

$args配列は、単に投稿がこのループ内に表示されるカスタムロジックです。この配列に入れることができるものの完全なリストは WP_Queryのドキュメント を見てください。

例えば、投稿タイプでフィルタしたいのであれば、 この文書の を参照してください。そうすれば、$args配列を次のように構築できることがわかります。

$args = array('post_type' => array('post', 'events'))

それが役立つことを願っています!

[編集]

私はあなたがアーカイブ内の投稿の単純な順不同のリストを取得したいと思うかもしれない(そして実際にwp_get_archivesが振る舞う方法であるので、必ずしも投稿自体を表示する必要はない)ことを悟りました。

ループを<ul>タグで囲み、次にループ出力内の<li>タグを アーカイブされた投稿のタイトル およびアーカイブされた投稿への パーマリンク で囲むことで、独自の番号なしリストを作成するだけです。

1
Jared Cobb