|
2 | 2 |
|
3 | 3 | namespace TheFold\WordPress;
|
4 | 4 |
|
5 |
| -class Router { |
| 5 | +class Dispatch { |
6 | 6 |
|
7 |
| - function __construct(array $url_callbacks, $priority = 5) { |
| 7 | + static function routes(array $url_callbacks, $priority = 5) { |
8 | 8 |
|
9 | 9 | add_filter('rewrite_rules_array', function($rules) use ($url_callbacks) {
|
10 |
| - |
11 |
| - foreach (array_keys($url_callbacks) as $look_for_in_url) { |
12 |
| - |
13 |
| - if(is_array($look_for_in_url)){ |
14 |
| - list($method, $route) = each($look_for_in_url); |
15 |
| - } else { |
16 |
| - $method = '*'; |
17 |
| - $route = $look_for_in_url; |
18 |
| - } |
19 |
| - |
20 |
| - $newRule = ['^'.trim($route,'/').'/?$' => 'index.php?'.$this->query_var_name($look_for_in_url).'='.$method]; |
21 |
| - $rules = $newRule + $rules; |
22 |
| - } |
23 |
| - |
24 |
| - return $rules; |
| 10 | + return array_reduce( array_keys($url_callbacks), function($rules, $route) { |
| 11 | + $newRule = ['^'.trim($route,'/').'/?$' => 'index.php?'.static::query_var_name($route).'=1']; |
| 12 | + return $newRule + $rules; |
| 13 | + }, $rules ); |
25 | 14 | });
|
26 | 15 |
|
27 | 16 | add_filter('query_vars', function($qvars) use ($url_callbacks) {
|
28 |
| - |
29 |
| - foreach (array_keys($url_callbacks) as $look_for_in_url) { |
30 |
| - |
31 |
| - $var = $this->query_var_name($look_for_in_url); |
32 |
| - $qvars[] = $var; |
33 |
| - } |
34 |
| - return $qvars; |
| 17 | + return array_reduce(array_keys($url_callbacks), function($qvars, $route) { |
| 18 | + $qvars[] = static::query_var_name($route); |
| 19 | + return $qvars; |
| 20 | + },$qvars); |
35 | 21 | });
|
36 |
| - |
37 |
| - add_action( 'template_redirect', function() use ($url_callbacks) { |
38 | 22 |
|
| 23 | + add_action( 'template_redirect', function() use ($url_callbacks) { |
39 | 24 | global $wp_query;
|
40 |
| - |
41 |
| - foreach ($url_callbacks as $url_key => $callback) { |
42 |
| - |
43 |
| - if ($wp_query->get( $this->query_var_name($url_key))) { |
44 |
| - |
45 |
| - if(is_array($url_key)){ |
46 |
| - list($method, $route) = $url_key; |
| 25 | + foreach ($url_callbacks as $route => $callback) { |
| 26 | + if ($wp_query->get( static::query_var_name($route))) { |
| 27 | + $wp_query->is_home = false; |
| 28 | + $params = null; |
| 29 | + preg_match('#'.trim($route,'/').'#',$_SERVER['REQUEST_URI'],$params); |
| 30 | + $res = call_user_func_array($callback,$params); |
| 31 | + if($res === false) { |
| 32 | + static::send_404(); |
47 | 33 | } else {
|
48 |
| - $method = '*'; |
49 |
| - $route = $url_key; |
50 |
| - } |
51 |
| - |
52 |
| - if($method == '*' || $method == $_REQUEST['REQUEST_METHOD']){ |
53 |
| - |
54 |
| - $wp_query->is_home = false; |
55 |
| - |
56 |
| - $params = null; |
57 |
| - |
58 |
| - preg_match('#'.trim($route,'/').'#',$_SERVER['REQUEST_URI'],$params); |
59 |
| - |
60 |
| - $res = call_user_func_array($callback,$params); |
61 |
| - |
62 |
| - if($res === false) |
63 |
| - $this->send_404(); |
64 |
| - else{ |
65 |
| - exit(); |
66 |
| - } |
| 34 | + exit(); |
67 | 35 | }
|
68 | 36 | }
|
69 | 37 | }
|
70 |
| - }, get_option('url_access_priority',$priority) ); |
71 |
| - |
| 38 | + }, get_option('thefold/router-priority',$priority) ); |
| 39 | + |
72 | 40 | add_action('init', function() use ($url_callbacks) {
|
73 |
| - $this->maybe_flush_rewrites($url_callbacks); |
| 41 | + static::maybe_flush_rewrites($url_callbacks); |
74 | 42 | }, 99);
|
75 | 43 | }
|
76 | 44 |
|
77 |
| - protected function maybe_flush_rewrites($url_callbacks) { |
78 |
| - |
| 45 | + static protected function maybe_flush_rewrites($url_callbacks) { |
79 | 46 | $current = md5(json_encode(array_keys($url_callbacks)));
|
80 |
| - |
81 | 47 | $cached = get_option(get_called_class(), null );
|
82 |
| - |
83 | 48 | if ( empty( $cached ) || $current !== $cached ) {
|
84 | 49 | flush_rewrite_rules();
|
85 | 50 | update_option(get_called_class(), $current );
|
86 | 51 | }
|
87 | 52 | }
|
88 |
| - |
89 |
| - protected function query_var_name($route) { |
90 | 53 |
|
| 54 | + static protected function query_var_name($route) { |
91 | 55 | static $cache;
|
92 |
| - |
93 | 56 | if (!isset($cache[$route])) {
|
94 |
| - $cache[$route] = md5(json_encode($route)); |
| 57 | + $cache[$route] = md5($route); |
95 | 58 | }
|
96 |
| - |
97 |
| - return $cache[$route]; |
| 59 | + return $cache[$route]; |
98 | 60 | }
|
99 | 61 |
|
100 |
| - protected function send_404() { |
101 |
| - |
| 62 | + static protected function send_404() { |
102 | 63 | global $wp_query;
|
103 |
| - |
104 | 64 | status_header('404');
|
105 |
| - |
106 | 65 | $wp_query->set_404();
|
107 | 66 | }
|
108 | 67 | }
|
0 commit comments