WordPressに独自リライトルールと独自URLパラメータの追加($wp_rewrite/$wp_query)
WordPressは内部的に常にURLのリライトを行いながら、
サイトのトップに配置している「index.php」が処理をしている事はご存知の事と思います。
WordPressの中のコンテンツで独自のURLを認識させるためには、
リライトルールを定義する必要があります。
尚、本ページは以下の1コンテンツとして紹介しているものです。
一連の流れは以下をご参照ください。
概要
どのようなURLを何に置換(リライト)するか?まず考える
最初はどのURLへのアクセスがあったら、
どのようにリライト(URLの内部置換)を行って処理をさせるのか?を考えます。
以下は作例(デモ)です。
今回の作例では「https://rensrv.com/weekday/」というURLのページを起点とします。
そのまま表示すると、現在日付を元に計算した曜日が表示されます。
このURLにはプログラムがショートコードで仕込んであり、
URLの後ろに「YYYY/MM/DD」形式の日付を付けてアクセスすると、
日付に応じた曜日が表示される仕組みです。
結果「2018/01/01」の曜日を判定して「月曜日」が画面に表示されます。
※実際はメッセージ形式で表示しています。
この場合「weekday/」に続くURL「YYYY/MM/DD/」を受け取って、
自分自身のURLへ「https://rensrv.com/weekday/」値として受け渡す必要があります。
※すべて「https://rensrv.com/weekday/?ymd=2018/01/01」風に、
…weekday/ の固定ページが処理を受け持っているという事です。
このプログラムを例にして、
サブディレクトリ形式で1つの固定ページや投稿の表示内容を、
アクセスされたURLに応じて切り替える仕組みをご紹介します。
ずっとやりたかったのですが(5年前から)
「やってるよ!」という記事をほとんど見かけませんでした。
たぶん、だけど、これは教えたくないし、教えるのも面倒なのかなと思ったりします。
実際、面倒ですし。
ただURLのパラメータで表示される結果がユニーク(一意性)であり、
個々にそれだけの価値があるコンテンツになるのであれば、
1コンテンツ(ページ)が一気に100にも1万にも・・それ以上にも増やせて怖い程の破壊力かと。
そう、インデックス戦争の現代ですから、他者に教えたくないよね。コレは。
まずこのリライトルールをここでは定義します。
考えたリライトルールとカスタム変数を追加する
今回、固定ページのURLの後に「YYYY/MM/DD/」がついた場合に、
付加された部分をクエリパラメータとして処理するように定義します。
functions.phpの記述(ここでは子テーマに定義)
「functions.php」でリライトルールを追加する為のphpファイルを読み込ませます。
1 |
include 'functions_rewrite.php'; |
個人的にはというか一般的にはテーマをカスタマイズするなら、
子テーマ化をしてから、子テーマのfunctions.phpを編集する事をお勧めします。
子テーマにしたからと言ってミスったら真っ白けっけになるのは同じですので、
併せて、バックアップとローカル環境での十分なテストを行ったうえでアップロードしましょう。
また私は「functions.php」に直接ソースを書かずに、
機能ごとに別のファイルを作り、そのファイルをincludeして利用しています。
functions_rewrite.phpの記述
読み込んでいるファイルには以下のように定義しています。
「functions_rewrite.php」の前半はこのようになっています。
クエリ変数の追加
フィルターフック「query_vars」をトリガーに、
「add_query_vars_filter」関数を実行し、独自に定義したい変数を追加します。
この例で利用しているのは2行目「$vars[] = "wd_ymd";
」部分です。
1 2 3 4 5 |
function add_query_vars_filter( $vars ){ $vars[] = "wd_ymd"; return $vars; } add_filter( 'query_vars', 'add_query_vars_filter' ); |
これによって、WordPressは「wd_ymd
」をクエリ文字列として認識するようになります。
リライトルールの追加
続いて、別の関数を定義しています。
ここでは実際のリライトルールを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function test_custom_endpoint( $wp_rewrite ) { $idx = 0; $pid_setting["wd_demo"] = array('36083', '39198'); if($_SERVER['HTTP_HOST'] == 'rensrv.com' ){ $idx = 1; } $wd_demo = $pid_setting["wd_demo"][$idx]; $feed_rules = array( 'weekday/(([0-9]{1,4})/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]))/?$' => 'index.php?page_id='. $wd_demo .'&wd_ymd='.$wp_rewrite->preg_index(1), ); $wp_rewrite->rules = $feed_rules + $wp_rewrite->rules; return $wp_rewrite->rules; } add_filter( 'generate_rewrite_rules', 'test_custom_endpoint' ); |
環境ごとのpage_idの切替例
3行目では、テスト環境か本番環境(rensrv.com)かを判定し、
それぞれのpage_idを切り替えています。
これはWordPress内記事を作成した際によって異なります。(環境依存)
page_idは記事の編集画面のURLからも確認できます。
例)https://rensrv.com/wdps/wp-admin/post.php?post=39198&action=edit
この39198は固定ページ「https://rensrv.com/weekday/」のpage_idです。
リライトルールの定義
次に、どのようにリライトするかの記述をします。(以下2行に分けています)
まず「https://rensrv.com/weekday/」の後に続く
「YYYY/MM/DD」部分を正規表現でマッチさせます。
'weekday/(([0-9]{1,4})/(0?[1-9]|1[0-2])/(0?[1-9]|[12][0-9]|3[01]))/?$'
条件に一致したら、取得済みのpage_idを指定(?page_id='. $wd_demo
)し、
その後に正規表現に一致した部分を後方参照にて変数として受け取っています。
※正規表現のカッコ内に該当した文字が「preg_index(1)」に渡されています。
=> 'index.php?page_id='. $wd_demo .'&wd_ymd='.$wp_rewrite->preg_index(1),
.htaccessなどで行うリライトやリダイレクトと似ていますが、
この定義はWordPressの内部URLのみに有効なリライトルールです。
また「get_the_ID();」や「$post->ID;」などでは、
このfunction.phpの読み込み段階でまだ表示対象が決定していないので動的に取得するのは困難かと。
リライトルールの初期化更新処理
リライトルールを変更する場合にはルールの初期化を行う必要があります。
以下のように「$wp_rewrite->flush_rules();
」を呼び出します。
1 2 3 4 5 6 |
function test_flush_rewrite_rules() { global $wp_rewrite; $wp_rewrite->flush_rules(); } add_filter('init', 'test_flush_rewrite_rules'); |
リライト処理の挙動(結果)
これで「https://rensrv.com/weekday/2018/05/30/」のようなURLでアクセスされた場合、
内部的には「https://rensrv.com/weekday/」のページに対して、
以下のようにクエリパラメータが渡されたように処理されます。
WordPress自体には、以下のように処理が渡されていますが。
https://rensrv.com/index.php?page_id=39198&wd_ymd=2018/05/30
概念としては、以下の様なURLで処理されているイメージになります。
https://rensrv.com/weekday/?wd_ymd=2018/05/30
値が受け取れるようになる点では同じです。
というか、この「index.phpに対してリライトする」って気づくまでかなり悩みました。。。
フィルターフック処理の呼び出され順の確認(参考)
「functions_rewrite.php」に定義した各関数を呼び出すフックとして、
以下の3行を記載しています。
add_filter('query_vars', 'add_query_vars_filter' );
add_filter('generate_rewrite_rules', 'test_custom_endpoint' );
add_filter('init', 'test_flush_rewrite_rules');
これは記述した順序は問わず、フィルターフックのタイミングで呼び出され実行されます。
処理の実行順序は「Debug Bar Actions and Filters Addon」プラグインを利用すると、
その時に表示しているページのアクションフックの順序が見れます。
公式サイトの代表例を確認するには以下が参考にはなります。
(参考)プラグイン API/アクションフック一覧 – WordPress Codex 日本語版
(参考)プラグイン API/フィルターフック一覧 – WordPress Codex 日本語版
上記のサンプルでは、すべて「add_filter()
」でフックしていますが、
正しくは、こう書くべきなのだと思います。(動いちゃいますけど)
add_filter('query_vars', 'add_query_vars_filter' );
add_action('generate_rewrite_rules', 'test_custom_endpoint' );
add_action('init', 'test_flush_rewrite_rules');
アクションに関しては「Debug Bar」で確認すると以下の順であることが確認できます。
- 43. init
- 55. generate_rewrite_rules
以下が全リストになります。(一例です、表示するページ・プラグインによって異なります)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
List of Action Hooks 1.muplugins_loaded 2.registered_taxonomy 3.registered_post_type 4.load_textdomain 5.footable-load_dependencies 6.footable-_init 7.plugins_loaded 8.auth_cookie_malformed 9.wp_roles_init 10.auth_cookie_valid 11.set_current_user 12.jetpack_module_loaded_latex 13.jetpack_module_loaded_custom-css 14.jetpack_module_loaded_shortlinks 15.jetpack_module_loaded_sharedaddy 16.jetpack_module_loaded_contact-form 17.jetpack_module_loaded_after-the-deadline 18.jetpack_module_loaded_notes 19.jetpack_module_loaded_widget-visibility 20.jetpack_module_loaded_widgets 21.jetpack_module_loaded_post-by-email 22.jetpack_module_loaded_gravatar-hovercards 23.jetpack_module_loaded_shortcodes 24.jetpack_module_loaded_json-api 25.jetpack_module_loaded_publicize 26.jetpack_module_loaded_subscriptions 27.jetpack_module_loaded_enhanced-distribution 28.jetpack_module_loaded_stats 29.jetpack_module_loaded_custom-content-types 30.jetpack_module_loaded_verification-tools 31.jetpack_module_loaded_monitor 32.jetpack_module_loaded_protect 33.jetpack_module_loaded_photon 34.jetpack_modules_loaded 35.sanitize_comment_cookies 36.setup_theme 37.unload_textdomain 38.dynamic_sidebar_before 39.dynamic_sidebar_after 40.register_sidebar 41.get_template_part_functions/create-thread 42.after_setup_theme 43.init 44.widgets_init 45.deprecated_constructor_run 46.wp_register_sidebar_widget 47.wp_default_scripts 48.wp_default_styles 49.wpseo_double_clean_titles 50.wp_loaded 51.update_option 52.update_option_rewrite_rules 53.updated_option 54.jetpack_sync_action_before_enqueue 55.generate_rewrite_rules 56.parse_request 57.send_headers 58.parse_query 59.pre_get_posts 60.posts_selection 61.parse_comment_query 62.pre_get_comments 63.parse_term_query 64.pre_get_terms 65.metadata_lazyloader_queued_objects 66.wp 67.template_redirect 68.admin_bar_init 69.debug_bar_enqueue_scripts 70.add_admin_bar_menus 71.get_header 72.wpseo_register_extra_replacements 73.wp_head 74.wp_enqueue_scripts 75.wpseo_head 76.the_post 77.wpseo_opengraph 78.wpseo_add_opengraph_images 79.wpseo_add_opengraph_additional_images 80.wpseo_twitter 81.wpseo_json_ld 82.wp_print_styles 83.wp_print_scripts 84.dynamic_sidebar 85.footable-_inline_styles 86.parse_tax_query 87.loop_start 88.get_template_part_sns 89.loop_end 90.get_sidebar 91.pre_get_search_form 92.get_template_part_newpost 93.begin_fetch_post_thumbnail_html 94.end_fetch_post_thumbnail_html 95.get_footer 96.wp_footer 97.wp_print_footer_scripts 98.footable-_inline_scripts 99.admin_bar_menu 100.wp_before_admin_bar_render 101.wp_after_admin_bar_render |
問題は「query_vars
」の実行タイミングですが、
「Debug Bar」でも確認できる情報が限られています。
Hook | Priority | Registered callbacks |
---|---|---|
query_vars | 1 |
|
10 |
|
あまりはっきりせず、モヤモヤするのですが、
公式ヘルプには以下のように書かれています。
カスタムクエリ変数
URL に付け加えるカスタムクエリ変数(例: add_query_arg() を使った “http://example.com/some_page/?my_var=foo” など)を使用するには、それらを WP_Query が扱えるパブリック・クエリ変数に追加する必要があります。パブリック・クエリ変数は WP_Query のインスタンスが作成される際に作られますが、幸運なことに実際に WP_Query の $query_vars プロパティにデータを投入する前には ‘query_vars’ フィルタが通されます。
つまり、新しい独自クエリ変数を WP_Query に含めるには ‘query_vars’ フィルタにフックしてクエリ変数を $vars 配列に追加すればよいのです。フィルタ関数でその配列を返すようにしましょう。以下をご覧ください。
123456 function add_query_vars_filter( $vars ){$vars[] = "my_var";return $vars;}add_filter( 'query_vars', 'add_query_vars_filter' );
- WP_Query::get() を参照。
- グローバル (object) $wp_query を使用。
とすると、実行タイミングは、
「WP_Query のインスタンスが作成される時」かつ「$query_varsへの値投入前」
であるとされている事が分かります。
また「WP_Query」には以下のように書かれています。
説明
WP_Query は
wp-includes/class-wp-query.php
に定義されているクラスで、WordPress ブログへの複雑な投稿やページのリクエストを取り扱います。wp-blog-header.php
(バージョン 2.0 では WP クラス) が $wp_query オブジェクトに現在のリクエストを定義する情報を与えることで、$wp_query はどのタイプのクエリを扱っているのか (カテゴリーアーカイブ、年月別アーカイブ、フィード、検索など) を確定し、要求された投稿を取り出します。$wp_query はリクエスト上の情報を多く保持していて、後からでも利用することができます。
という事になりますので値が設定されるのは、
「wp-blog-header.php」なので、アクションフックに照らし合わせると、
- 73. wp_head
およその呼ばれ順はこのようになっていると推測できます。
- 43. init
- 55. generate_rewrite_rules
- 73. wp_head(query_vars)
①add_filter(‘init‘, ‘test_flush_rewrite_rules’);
②add_filter(‘generate_rewrite_rules‘, ‘test_custom_endpoint’ );
③add_filter(‘query_vars‘, ‘add_query_vars_filter’ );
①リライトルールを初期化
②リライトルールの挿入追記
③カスタムクエリ変数を登録
しかし、なんかもっとすんなり処理順序分かる方法ないですかね。
デバッグすればいいんですけども。
何だかんだでアプリケーションを準備するリライトとクエリ文字列の追加が完了です。
このクエリ文字列を受け取って、動的にコンテンツを出力するショートコードを作ります。
この囲み部には誤りがありました。以下を参照ください。
以下は全く的外れなアプローチでした。訂正いたします。
これは記述した順序は問わず、フィルターフックのタイミングで呼び出され実行されます。
処理の実行順序は「$wp_filter」の配列キーをチェックすると分かります(たぶん)。
ざっくりこんな感じで抜いています。
1 2 3 4 5 |
global $wp_filter; foreach($wp_filter as $key => $val){ $res[$cnt] = $key; $cnt++; } |
以下はテスト環境(ローカル)で抜いたものですので、
当サイトのものではありませんが、以下のような出力が得られます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 |
Array ( [0] => pre_term_name [1] => pre_comment_author_name [2] => pre_link_name [3] => pre_link_target [4] => pre_link_rel [5] => pre_user_display_name [6] => pre_user_first_name [7] => pre_user_last_name [8] => pre_user_nickname [9] => term_name [10] => comment_author_name [11] => link_name [12] => link_target [13] => link_rel [14] => user_display_name [15] => user_first_name [16] => user_last_name [17] => user_nickname [18] => pre_term_description [19] => pre_link_description [20] => pre_link_notes [21] => pre_user_description [22] => pre_comment_author_email [23] => pre_user_email [24] => comment_author_email [25] => user_email [26] => pre_comment_author_url [27] => pre_user_url [28] => pre_link_url [29] => pre_link_image [30] => pre_link_rss [31] => pre_post_guid [32] => user_url [33] => link_url [34] => link_image [35] => link_rss [36] => comment_url [37] => post_guid [38] => pre_term_slug [39] => pre_post_type [40] => pre_post_status [41] => pre_post_comment_status [42] => pre_post_ping_status [43] => pre_post_mime_type [44] => post_mime_type [45] => content_save_pre [46] => excerpt_save_pre [47] => comment_save_pre [48] => pre_comment_content [49] => comment_author [50] => link_description [51] => link_notes [52] => bloginfo [53] => wp_title [54] => widget_title [55] => the_content [56] => the_title [57] => comment_text [58] => single_post_title [59] => single_cat_title [60] => single_tag_title [61] => single_month_title [62] => nav_menu_attr_title [63] => nav_menu_description [64] => term_description [65] => term_name_rss [66] => wp_insert_post_parent [67] => wp_update_term_parent [68] => the_excerpt [69] => get_the_excerpt [70] => comment_excerpt [71] => list_cats [72] => wp_sprintf [73] => the_title_rss [74] => the_content_rss [75] => the_excerpt_rss [76] => comment_author_rss [77] => comment_text_rss [78] => bloginfo_rss [79] => the_author [80] => option_ping_sites [81] => option_blog_charset [82] => option_home [83] => option_siteurl [84] => tiny_mce_before_init [85] => pre_kses [86] => sanitize_title [87] => check_comment_flood [88] => comment_flood_filter [89] => comment_email [90] => option_tag_base [91] => option_category_base [92] => the_posts [93] => comments_open [94] => pings_open [95] => editable_slug [96] => nav_menu_meta_box_object [97] => pingback_ping_source_uri [98] => xmlrpc_pingback_error [99] => http_request_host_is_external [100] => wp_head [101] => publish_future_post [102] => wp_footer [103] => template_redirect [104] => wp_print_footer_scripts [105] => init [106] => after_switch_theme [107] => login_head [108] => login_footer [109] => login_init [110] => rss2_head [111] => commentsrss2_head [112] => rss_head [113] => rdf_header [114] => atom_head [115] => comments_atom_head [116] => opml_head [117] => app_head [118] => do_feed_rdf [119] => do_feed_rss [120] => do_feed_rss2 [121] => do_feed_atom [122] => do_pings [123] => do_robots [124] => set_comment_cookies [125] => sanitize_comment_cookies [126] => admin_print_scripts [127] => admin_print_footer_scripts [128] => admin_print_styles [129] => plugins_loaded [130] => shutdown [131] => post_updated [132] => publish_post [133] => transition_post_status [134] => comment_form [135] => wp_scheduled_delete [136] => wp_scheduled_auto_draft_delete [137] => admin_init [138] => importer_scheduled_cleanup [139] => upgrader_scheduled_cleanup [140] => welcome_panel [141] => delete_post [142] => delete_term [143] => begin_fetch_post_thumbnail_html [144] => end_fetch_post_thumbnail_html [145] => pre_option_gmt_offset [146] => admin_color_scheme_picker [147] => default_option_link_manager_enabled [148] => default_option_embed_autourls [149] => heartbeat_settings [150] => admin_enqueue_scripts [151] => heartbeat_send [152] => heartbeat_nopriv_send [153] => authenticate [154] => determine_current_user [155] => setup_theme [156] => wp_loaded [157] => delete_attachment [158] => save_post [159] => update_option_start_of_week [160] => update_option_gmt_offset [161] => admin_menu [162] => before_delete_post [163] => wp_trash_post [164] => request [165] => term_link [166] => get_post_format [167] => get_terms [168] => wp_get_object_terms [169] => set_current_user [170] => wp_default_scripts [171] => wp_print_scripts [172] => print_scripts_array [173] => wp_default_styles [174] => style_loader_src [175] => wp_version_check [176] => upgrader_process_complete [177] => load-plugins.php [178] => load-update.php [179] => load-update-core.php [180] => wp_update_plugins [181] => load-themes.php [182] => wp_update_themes [183] => wp_maybe_auto_update [184] => pre_post_update [185] => edit_form_advanced [186] => wp_playlist_scripts [187] => customize_controls_enqueue_scripts [188] => nav_menu_item_id [189] => in_admin_header [190] => wp_ajax_add-category [191] => wp_ajax_add-post_tag [192] => wp_ajax_add-nav_menu [193] => wp_ajax_add-link_category [194] => wp_ajax_add-post_format [195] => future_post [196] => future_page [197] => future_attachment [198] => future_revision [199] => future_nav_menu_item [200] => add_meta_boxes [201] => bj_lazy_load_run_filter [202] => wp [203] => activate_plugin [204] => query [205] => debug_bar_panels [206] => admin_bar_menu [207] => parse_request [208] => after_setup_theme [209] => posts_request [210] => pre_get_posts [211] => wp_redirect [212] => widgets_init [213] => register_sidebar [214] => wp_register_sidebar_widget [215] => send_headers [216] => parse_query [217] => posts_selection [218] => get_header [219] => wp_enqueue_scripts [220] => wp_print_styles [221] => get_template_part_loop [222] => loop_start [223] => the_post [224] => loop_end [225] => get_sidebar [226] => dynamic_sidebar [227] => get_search_form [228] => wp_meta [229] => get_footer [230] => twentyten_credits [231] => auth_redirect [232] => _admin_menu [233] => load-edit.php [234] => admin_xml_ns [235] => admin_print_styles-edit.php [236] => admin_print_scripts-edit.php [237] => admin_head-edit.php [238] => admin_head [239] => adminmenu [240] => admin_notices [241] => restrict_manage_posts [242] => in_admin_footer [243] => admin_footer [244] => admin_footer-edit.php [245] => admin_bar_init [246] => jetpack_photon_url [247] => jetpack_photon_pre_args [248] => jetpack_photon_add_query_string_to_domain [249] => jetpack_photon_any_extension_for_domain [250] => activate_jetpack/jetpack.php [251] => deactivate_jetpack/jetpack.php [252] => jetpack_static_url [253] => bp_core_pre_avatar_handle_upload [254] => activate_per-page-add-to/perpagehead.php [255] => wp_rp_admin_notices [256] => wp_rp_cron_extract_images_from_post [257] => plugin_action_links_wordpress-23-related-posts-plugin/init.php [258] => wp_ajax_wprp_subscribe [259] => wp_ajax_rp_dismiss_notification [260] => wp_ajax_rp_update_related_posts [261] => activate_wordpress-23-related-posts-plugin/init.php [262] => deactivate_wordpress-23-related-posts-plugin/init.php [263] => all_admin_notices [264] => wp_ajax_wp_rp_load_articles [265] => wp_ajax_nopriv_wp_rp_load_articles [266] => wpmu_new_blog [267] => activate_wp-dtree-30/wp-dtree.php [268] => deactivate_wp-dtree-30/wp-dtree.php [269] => scb_activation_bj-lazy-load/bj-lazy-load.php [270] => plugin_row_meta [271] => deleted_post [272] => created_category [273] => edited_category [274] => delete_category [275] => publish_page [276] => wp_update_nav_menu [277] => update_option_permalink_structure [278] => add_link [279] => delete_link [280] => edit_link [281] => apto_order_update [282] => apto_order_update_hierarchical [283] => post_gallery [284] => child-pages-shortcode-template [285] => query_vars [286] => generate_rewrite_rules [287] => wp_unique_post_slug [288] => excerpt_length [289] => excerpt_more [290] => the_content_more_link [291] => pre_ping [292] => switch_theme [293] => comment_post [294] => edit_comment [295] => transition_comment_status [296] => jetpack_require_lib_dir [297] => jetpack_sync_all_registered_options [298] => delete_option_home [299] => update_option_home [300] => add_option_home [301] => delete_option_siteurl [302] => update_option_siteurl [303] => add_option_siteurl [304] => delete_option_blogname [305] => update_option_blogname [306] => add_option_blogname [307] => delete_option_gmt_offset [308] => add_option_gmt_offset [309] => delete_option_timezone_string [310] => update_option_timezone_string [311] => add_option_timezone_string [312] => jetpack_clean_nonces [313] => xmlrpc_blog_options [314] => admin_body_class [315] => wp_ajax_jetpack-check-news-subscription [316] => wp_ajax_jetpack-subscribe-to-news [317] => wp_ajax_jetpack-sync-reindex-trigger [318] => wp_ajax_jetpack-sync-reindex-status [319] => jetpack_activate_module [320] => plugins_url [321] => map_meta_cap [322] => jetpack_get_default_modules [323] => bj_lazy_load_html [324] => post_thumbnail_html [325] => get_avatar [326] => body_class [327] => debug_bar_classes [328] => deprecated_function_run [329] => deprecated_file_included [330] => deprecated_argument_run [331] => deprecated_function_trigger_error [332] => deprecated_file_trigger_error [333] => deprecated_argument_trigger_error [334] => whitelist_options ) |
以下の順で出現しています。
1 2 3 |
[105] => init [285] => query_vars [286] => generate_rewrite_rules |
その為、それぞれは以下の順で呼ばれることが分かります。
①add_filter('init', 'test_flush_rewrite_rules');
②
add_filter('query_vars', 'add_query_vars_filter' );
③add_filter('generate_rewrite_rules', 'test_custom_endpoint' );
①リライトルールを初期化
②カスタムクエリ変数を登録
③リライトルールの挿入追記
誤記終わり。
誤記失礼いたしました。
何だかんだでアプリケーションを準備するリライトとクエリ文字列の追加が完了です。
このクエリ文字列を受け取って、動的にコンテンツを出力するショートコードを作ります。
当サイト内のコンテンツおよび画像を含むすべてにおいて、管理人アルゴリズンが著作権を保持しております。
当サイトでご紹介しております写真等につきましては著作権の放棄はしませんが、
ライセンスフリーでご利用いただいて構いません。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
サイト内コンテンツを引用される際には、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
公開日:
最終更新日:2018/06/02