• 解決済 echizenya

    (@echizenya)


    いつもお世話になっております。
    以下のget_archives_linkフィルターについてご存知の方がいらっしゃいましたらご教示願います。

    【質問の主旨】

    get_archives_linkフィルターを使って関数を作成するときの6つの仮引数は、sidebar.phpなど表示を担当する
    ファイルにおいて、どうやって実引数を入力すれば良いのでしょうか?

    【質問の補足】

    1.
    今回の質問は下記のトピックの続きです。コメントをいただいたにも関わらず、私がうっかり見落として返答するのに日にちが経過しましたので、新しいトピックを立てました。
    https://goo.gl/ywfX7L

    2.
    上記のURLでも最後のコメントで同じ質問をしておりますが、具体的には以下のとおりです。functions.phpにおいて

    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($format, $link_html, $url,$text, $after );
    }
    
    add_filter( 'get_archives_link','my_archive_link', 10, 6 );

    と定義して、

    sidebar.phpで

    <?php my_archive_link(); ?>

    とすると、

    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

    というエラーが出ます。いずれも実引数の定義がないと指摘されていると思いますが、<?php my_archive_link(); ?>でどんな実引数を入力すれば良いのか分かりません。

    3.
    今回の質問は個人で運営しているブログに関する質問で、現在は応急的に、wp_get_archives()を使用しています。

    4.
    今回の質問に関するコードは、全てGitHub上にUPしています。
    https://github.com/echizenyayota/e-yota/tree/personal_lesson_20171012

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

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

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

    私の方では、以下で動いています。

    function
    https://github.com/tenman/raindrops/blob/master/functions.php#L13810-L13835

    hook
    https://github.com/tenman/raindrops/blob/master/lib/hooks.php#L443

    • この返信は6年、 8ヶ月前にnobitaが編集しました。

    こんにちは

    フィルタの使い方が間違っています。
    my_archive_link()は、コアのget_archives_link関数の中でget_archives_linkフィルタを通じて呼び出されるもので、テンプレートに直接記述するものではありません。

    参考:https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API#.E3.83.95.E3.82.A3.E3.83.AB.E3.82.BF.E3.83.BC

    トピック投稿者 echizenya

    (@echizenya)

    @nobita さん。 @munyagu さん。
    それぞれアドバイスありがとうございます。
    今、コメントを拝見しました。ただその内容に基づいて、詳しいお返事をすぐにすることができません。
    しばらく時間をいただき、考えたのちに改めてお礼とコメントを述べます。
    取り急ぎアドバイスをいただいたお礼を申し上げます。

    トピック投稿者 echizenya

    (@echizenya)

    @nobita さん
    改めてコメントとアドバイスのお礼を申し上げます。
    本番環境とよく似たローカル開発環境上のWordPressサイトで、お手本のコードを試しました。
    ですがサイドバーに月別アーカイブリストを表示させることはできませんでした。

    表示されない原因の1つとして、functions.phpとlib/hook.phpの関係性が定義されていないことが、
    考えられますが、@nobita さんは、両者の関係性についてどうやって定義されているのでしょうか?

    functions.php
    https://github.com/echizenyayota/e-yota/blob/monthly_archivelist20171115/wp-content/themes/mytheme/functions.php#L228
    lib/hook.php
    https://github.com/echizenyayota/e-yota/blob/monthly_archivelist20171115/wp-content/themes/mytheme/lib/hook.php#L1-L2

    お忙しいところ、たびたびの質問でまことに恐れ入ります。お手すきのときにでもご教示いただければ幸いです。

    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん。
    改めてコメントとアドバイスのお礼を申し上げます。

    >テンプレートに直接記述するものではありません。

    自分が知っている狭い範囲の知識で恐縮です。
    今までWordPressについて教えていただいた方や読んだ本によると、
    「WordPressの中で安易にテンプレートファイル以外のファイルを保存してはいけない」
    とよく聞きます。my_archive_link()関数の出力表示はwp-contentディレクトリにおいて、
    どこに記述すればよろしいでしょうか?

    またmy_archive_link()関数を定義しているfunctions.phpの

    function my_archive_link() {
     ...
    }

    とどうやって紐づけを行えばよろしいでしょうか?
    お忙しいところ、たびたびの質問でまことに恐れ入ります。お手すきのときにでもご教示いただければ幸いです。

    こんにちは

    以下のトピックでは、my_tag_cloud_filterをテンプレートに記述したりはしていないと思います。
    同じことです。

    タグクラウドで使われているタグの数を表示させるためにはどうすればよいでしょうか?

    get_archives_linkが呼び出されたら自動的にmy_archive_linkも呼び出されます。

    フィルターフックの詳細については、先に参考に挙げさせて頂いたページを確認してみてください。

    プラグイン API

    • この返信は6年、 8ヶ月前にmunyaguが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @munyagu さん
    たびたびのコメントありがとうございます。

    以下のトピックでは、my_tag_cloud_filterをテンプレートに記述したりはしていないと思います。

    ご指摘ありがとうございます。
    タグクラウドで使われているタグの数を表示させるためにはどうすればよいでしょうか?(前回)
    と今回の質問を比較して、今回の質問ではウィジェットメニューの設定が違うこと分かりました。

    – タグクラウド(前回) → タグクラウドがウィジェットのサブメニューとして追加されていた。
    – 月別アーカイブリスト(今回) → 月別アーカイブリストがウィジェットのサブメニューとして追加されていなかった。

    従って月別アーカイブリストをウィジェットのサブメニューとして追加して、改めてfunctions.phpに

    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($format, $link_html, $url,$text, $after );
    
    }
    add_filter( 'get_archives_link','my_archive_link', 10, 6 );

    のコードをはると以下の画像のような表示がされることが分かりました。

    http://takaiba.net/wp-forum/wpforum20171115.png

    なぜこうなるのかを追究しだすと、質問の主旨がずれていくと思います。
    このコメントで自分が不思議に思っていることについては、機会を見て別途、質問の投稿をいたします。

    ちなみに本番環境では、functions.phpには上記のコードを記述せず、
    ウィジェットのサブメニューとしてアーカイブリストを出力するにとどめています。

    たくさんのアドバイスありがとうございました!

    以前に喩えました私の話がよろしくなかったようでよい進言になっていなかったのだと反省しております。
    フィルターフックについて、こりずに再度たとえてお話をしてみます。

    読み込み開始から描画までの間サーバーでこなす仕事がベルトコンベアー上に並んであり
    ライン製造のように動作をしていくのですが
    いくつかチェックポイントがあり、係員が作業していて
    その係員の名前が フックなのです。

    その係員フックに フィルター動作について指示を出すのがフィルターフックです。

    たとえば、ライン製造工程の「アーカイブのリンクを取得する」という段階に立っているフックに対して
    「あなたのフィルター作業は、このタイミングの場合具体的にこうしなさい、抽出の方法をこうしなさい」
    と、命令するのがフィルターフックなのです。

    そのライン製造のタイミングには、ほかの通常動作でフィルター処理をするとき用に現場内で準備されたデータがまわりにある状態です。
    アーカイブがあり、リンクがあり、抽出要項があり、それらで動作する準備があり
    それらをつかって抽出する際、具体的な指示をだすのが、フィルターフックです。

    なので、その段階で生成されている変数や関数をパラメータとしてなんの脈絡もないように見える形で
    とりこむことも可能です。
    その読み込む時点では生成されていて、作業が通過すると破棄される一時的な変数もあります。

    これは、個人で作成された独自関数のようにパラメータや、元データをつくったり準備したりする必要の有無がことなります。
    個人で関数をつくった場合、前後になにも脈絡がないのでゼロからデータを準備しなくてはなりません。

    ですがフィルター動作内ではフィルター動作のために準備されたデータがその時点にはあります。
    アーカイブ処理をするというラインにはアーカイブデータがあり、それを横取りするというか
    その処理の途中に命令を挟むというか、その時点でのそのデータに命令をだすのがフックです。

    なので、ラインをはずれて脈絡なく関数を読み出しても、なにも準備がなされていないので値がないといわれます。

    フックをするとアーカイブのリンクを生成する段階において、アーカイブのリンクデータ抽出方法について具体的な変更要領を含むと
    ワードプレスの恒常動作であるアーカイブリンク抽出動作が、なにかひと手間加わったように出てくることになります。

    どうでしょうか。これでウィジットにつかうものではないようなイメージはつきますでしょうか。

    表示されない原因の1つとして、functions.phpとlib/hook.phpの関係性が定義されていないことが、
    考えられますが、@nobita さんは、両者の関係性についてどうやって定義されているのでしょうか?

    filter や action はWordPressをカスタマイズするために避けて通れません。

    フィルター関数の使い方をしっかり覚えましょう。

    関数との関係性は、

    
    add_filter( 'フィルターの名前','関数名', 優先度, フィルターが持っている引数の数の中から関数で使用する数 );
    

    で定義しています。

    functions.phpとlib/hook.phpの関係性

    https://github.com/tenman/raindrops/blob/master/functions.php#L129-L132

    で、インクルードしています

    中身としては、チャイルドテーマにそのファイルがあれば(hooks.php)それをインクルード、なければ親テーマのhooks.phpをインクルードしています。
    get_theme_file_path()なんかの関数がなかったころからやっているので、自前関数を使っています。

    • この返信は6年、 8ヶ月前にnobitaが編集しました。
    トピック投稿者 echizenya

    (@echizenya)

    @msio さん。
    いつもご丁寧なコメントありがとうございます。

    いただいたアドバイスを精読したところ以下の「気づき」がありました。

    • 「ライン製造(フィルター)」には具体的なデータ(アーカイブやリンク)がすでに用意されている
    • フィルターフックはそのデータを加工・抽出ができる。具体的にはadd_filter()関数の第二引数の独自関数で定義できる
    • 「ライン製造(フィルター)」を外れるとfunctions.phpで加工し、引数も自分で用意しなければならない

    フィルターフックについて、何度もレクチャーしてくださり、またそれを自分なりにまとめる作業をすると、どんな機能で何ができるのか、ようやく分かってきました。本やGoogle検索するだけでは得られない体験をさせていただき、ありがとうございます。

    これからもどうぞよろしくお願いします。

    トピック投稿者 echizenya

    (@echizenya)

    @nobita さん。
    たびたびのコメントありがとうございます。

    フィルター関数の使い方をしっかり覚えましょう。

    おかげさまで、様々な方からのアドバイスを読んで自分の言葉で述べていくと、
    その概念や機能などが分かるようになってきました。

    で、インクルードしています

    こちらの方についても解説ありがとうございます。
    今後、WordPressのカスタマイズをするときの参考にさせていただきます。

    これからもどうぞよろしくお願いします。

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「get_archives_linkフィルターで定義した仮引数はどのような実引数を入力すればよろしいでしょうか?」には新たに返信することはできません。