サポート » 使い方全般 » getarchives_whereフィルターフックのカスタマイズについて

  • 解決済 echizenya

    (@echizenya)


    いつもお世話になっております
    getarchives_whereというフィルターフックの使い方についてご存知の方がいらっしゃいましたら、ご教示願います。

    【質問の主旨】

    1.
    公式ドキュメントを読むとgetarchives_whereフィルターフックは、第二引数としてwhere句を含むクエリ文が使われています。
    なぜでしょうか?

    2.
    同じく第三引数として、「デフォルトの配列」が使われています。配列の要素として何が指定できるのでしょうか?

    3.
    質問の意図は、個人ブロのサイドバーに出力している月別アーカイブリストを、その上で出力されているタグクラウドと同様にカスタマイズすることです。どうすればよろしいでしょうか?

    【質問の主旨】

    1.
    質問の意図についての詳細は、下記の記事にまとめています。
    https://e-yota.com/webservice/page_session_wp_get_archives_getarchives_where

    2.
    先日、フォーラムでタグクラウドに関する質問をしました。https://goo.gl/kaakFZ
    個人的にはgetarchives_whereフィルターフックはこのときと似た感じになると思っています。

    function my_get_archives_filter($args, $sql_where) {
    	global $wpdb;
        $sql_where = ...
        $myargs = array(
            ...
        );
        return ...;
    }
    apply_filters('getarchives_where', 'my_get_archives_filter');

    ただ”…”で表されている部分について、何を入れれば良いのかよく分かりません

    3.
    Google検索などでこちらの記事を見つけましたが、目的が違うせいか、自分の意図と合わせるためには
    どのように応用すれば良いのか分かりません。
    https://liginc.co.jp/programmer/archives/4031

    以上、よろしくお願い申し上げます。

    ヘルプの必要なページ: [リンクを見るにはログイン]

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • こんにちは

    記事を拝見しましたが、アンカーリンクを変更したりするのはget_archives_linkフィルターフックと思います。
    上記フィルターフックでインラインスタイルも追加できると思いますが、フォントサイズはcssで変更してはどうでしょうか。
    使った事はないんですが。

    getarchives_whereフィルターフックは取得する対象を変更するためのものです。
    今年のものだけ出力する、など。
    ですので、目的とは合わないと思います。

    お振りいただいている番号の順番にお話しするのが苦手なのでご容赦ください。
    まず「・・・」に入るものが不明とのことですが、ここには任意のものが入りますので特に何がということはないと思います。

    そしてお望みのアーカイブの抽出に対して整形したいとの旨は「アーカイブの抽出結果を保持している変数のつきとめ」と「それに対する変更」ないしは「希望の抽出結果」の形成ではないかと思います。
    @munyagu さんのご指摘が合致しているかと思いますのでアーカイブの形成方法についてお話が進まれるとよいのではないかと思います。

    そしてその抽出という主題からはそれてしまいますが、getarchives_whereフィルターフックについてなのですが、フィルターフックというのはアクセスについて表示情報の形成順序があり、形成していく過程(フィルター)の任意の段階に割り込む(フック)するものだと思います。
    イメージ的にはアクセスされた方に対して準備している条件について、ろ過していって最終的に抽出物が形成されるまでのフィルター(形成過程の要素)の割り込み枚数(フック)だと思います。

    なので、「フィルターフック」とは「○○をする時に、その作業担当についでに××させる」の「××させる」を追加するものだと思います。
    getarchives_whereは、検索を行う前に存在するフィルタ名で、そこにフック(apply_filters)する、ということですので、その引数2番目のファンクションを実行して、それを踏まえたりした後ワードプレスの検索機能が実行されるということだと思います。
    なので逆に・・・に入るべきものとは、ワードプレスの抽出にかかわるもの(グローバル変数などで条件やデータを含ませる等)や、検索を実行するまえにしておきたい作業をいれるものだと思います。
    つまり
    apply_filters('getarchives_where', 'my_get_archives_filter');

    ワードプレスが検索を実行する前に
    my_get_archives_filter
    を実行しますよ、実行してから検索をしますよという割り込み宣言だと思います。
    抽出結果の如何については、ワードプレスの抽出に関する動作 my_get_archives_filter でクエリなどを形成してグローバル変数にして検索条件を変化させるファンクションそのものではないでしょうか。

    フィルターはとくにろ過設定のないものなどもざるとして多数存在していて、初期化時(イニシャライズ)やコンテンツ・プラグイン等を読み込み時、ヘッダー形成時、などなどさまざなタイミグでワードプレスが動作を設定しているものがあります。
    そのフィルタ通過時、動作時にファンクションなどで形成したプログラムを動作させるという「タイミングの設定方法=フィルターフック」だと思います。とくにフィルターフック自体が動作するわけではなく、フィルターフックというタイミングでどんなモジュールを動作させるかだと思います。
    抽出結果の形成方法にまったく言及できませんでしたが、お邪魔でなければありがたいです。

    @munyagu さん。 @msioさん。
    いつもコメントとアドバイスありがとうございます。
    質問を投稿した後に急にバタバタしまして、確認が遅くなりました。恐れ入ります。
    まずはお礼を申し上げます。

    これからいただいた内容を詳しく確認いたします。
    お時間をいただいたのちに改めて、コメントをいたします。
    よろしくお願い申し上げます。

    @munyagu さん。
    get_archives_linkに関するアドバイスありがとうございます。
    get_archives_linkをキーワードとして、Google検索で調べて確認したところ、
    こちらのページで紹介されているCODE2の例が、自分がやりたいことともっとも近い感じがします。

    function add_nen_year_archives( $link_html ) {
        $regex = array ( 
            "/ title='([\d]{4})'/"  => " title='$1年'",
            "/ ([\d]{4}) /"         => " $1年 ",
            "/>([\d]{4})<\/a>/"        => ">$1年</a>"
        );
        $link_html = preg_replace( array_keys( $regex ), $regex, $link_html );
        return $link_html;
    }
    add_filter( 'get_archives_link', 'add_nen_year_archives' );

    ただこのコードについては、いくつか自分でも分からないことがあります。
    その分からないことを聞くことは、今回の質問の範疇を超えているように思います。
    別途、質問トピックスを立てて他のみなさんからもアドバイスをいただくようにします。
    今後ともどうぞよろしくお願い申し上げます。

    @msio さん。

    getarchives_whereの引数に関する説明以外にも、フィルターフックの動作全般に関して、詳細なご説明をいただきありがとうございます。

    イメージ的にはアクセスされた方に対して準備している条件について、ろ過していって最終的に抽出物が形成されるまでのフィルター(形成過程の要素)の割り込み枚数(フック)だと思います。

    なので、「フィルターフック」とは「○○をする時に、その作業担当についでに××させる」の「××させる」を追加するものだと思います。

    特に上記の文章につきましては、大変分かりやすい表現であると思います。「フィルターフック」という言葉について、分かったようで分からないところがありましたので。他の「フィルターフック」についても、その機能が分からない時が発生しましたら、この考え方や表現を参考にさせていただきます。
    今後ともどうぞよろしくお願い申し上げます。

    こんにちは、

    
    function add_nen_year_archives( $link_html ) {
        $regex = array ( 
            "/ title='([\d]{4})'/"  => " title='$1年'",
            "/ ([\d]{4}) /"         => " $1年 ",
            "/>([\d]{4})<\/a>/"        => ">$1年</a>"
        );
        $link_html = preg_replace( array_keys( $regex ), $regex, $link_html );
        return $link_html;
    }
    add_filter( 'get_archives_link', 'add_nen_year_archives' );
    

    のコードなんですが、このフィルターは、引数が6個ほどついているので、正規表現を使わなくても大丈夫です。

    参考になるかどうかわかりませんが、簡単な例です。

    直接の質問とは異なるコードですが、以下では、件数をリンク内に配置して、件数の括弧を取り外す処理をしています。

    
    add_filter( 'get_archives_link','my_archive_link', 10, 6 );
     
    function my_archive_link( $link_html, $url, $text, $format, $before, $after){
    	
    	$after = str_replace( array('(',')'),'', $after );
    	
    	$link_html = '<li>
                              <a href="%1$s" class="rd-archive-link">
    				<span class="rd-archive-date">%2$s</span>
    				<span class="rd-archive-count"> %3$s</span>
    			  </a>
                         </li>';
    	
    	return sprintf( $link_html, $url,$text, $after );
    }
    
    • この返信は2年、 9ヶ月前にnobitaが編集しました。

    @nobita さん。
    いつもご丁寧なコメントありがとうございます。
    貴重なアドバイスをいただいたにも関わらず、お礼のコメントが大変遅くなり誠に申し訳ありません。

    @nobita さんに教えていただいたコードをそのままsidebar.phpにコピペして実行しました。
    するとサイドバーにおいて、「引数が定義されていない」と表示されます。

    Warning: Missing argument 1 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    Warning: Missing argument 2 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    Warning: Missing argument 3 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    Warning: Missing argument 4 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    Warning: Missing argument 5 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    Warning: Missing argument 6 for my_archive_link(), called in /var/www/e-yota/wp-content/themes/mytheme/sidebar.php on line 120 and defined in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 191
    
    Notice: Undefined variable: after in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 193
    Notice: Undefined variable: format in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 202
    Notice: Undefined variable: url in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 202
    Notice: Undefined variable: text in /var/www/e-yota/wp-content/themes/mytheme/functions.php on line 202

    functions.phpで定義されたmy_archive_link()の仮引数はsidebar.phpでどんな実引数を入力すれば良いのでしょうか?
    (ただし上記のエラーはmy_archive_link関数の返り値となるsprintf関数の第一引数に$formatを加えた場合のエラーです。
    PHPの公式ドキュメントを確認すると、sprintf関数の第一引数には$formatを入力するのが望ましいと考えたためです)
    http://php.net/manual/ja/function.sprintf.php

    ただ、今回の返答は私の対応が遅れたため、関連する新しいトピックスを立てています。
    他の方にもご意見やアドバイスをいただきたいと考えております。
    https://goo.gl/9nKZrE

    今後ともどうぞよろしくお願い申し上げます。

7件の返信を表示中 - 1 - 7件目 (全7件中)
  • トピック「getarchives_whereフィルターフックのカスタマイズについて」には新たに返信することはできません。