1 | <?php |
---|
2 | require 'wp-load.php'; |
---|
3 | |
---|
4 | function get_permalink_with_obj( $id = 0, $leavename = false ) { |
---|
5 | $rewritecode = array( |
---|
6 | '%year%', |
---|
7 | '%monthnum%', |
---|
8 | '%day%', |
---|
9 | '%hour%', |
---|
10 | '%minute%', |
---|
11 | '%second%', |
---|
12 | $leavename? '' : '%postname%', |
---|
13 | '%post_id%', |
---|
14 | '%category%', |
---|
15 | '%author%', |
---|
16 | $leavename? '' : '%pagename%', |
---|
17 | ); |
---|
18 | |
---|
19 | if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) { |
---|
20 | $post = $id; |
---|
21 | $sample = true; |
---|
22 | } else { |
---|
23 | $post = get_post($id); |
---|
24 | $sample = false; |
---|
25 | } |
---|
26 | |
---|
27 | if ( empty($post->ID) ) |
---|
28 | return false; |
---|
29 | |
---|
30 | if ( $post->post_type == 'page' ) |
---|
31 | return get_page_link($post, $leavename, $sample); |
---|
32 | elseif ( $post->post_type == 'attachment' ) |
---|
33 | return get_attachment_link( $post->ID, $leavename ); |
---|
34 | elseif ( in_array($post->post_type, get_post_types( array('_builtin' => false) ) ) ) |
---|
35 | return get_post_permalink($post->ID, $leavename, $sample); |
---|
36 | |
---|
37 | $permalink = get_option('permalink_structure'); |
---|
38 | |
---|
39 | /** |
---|
40 | * Filter the permalink structure for a post before token replacement occurs. |
---|
41 | * |
---|
42 | * Only applies to posts with post_type of 'post'. |
---|
43 | * |
---|
44 | * @since 3.0.0 |
---|
45 | * |
---|
46 | * @param string $permalink The site's permalink structure. |
---|
47 | * @param WP_Post $post The post in question. |
---|
48 | * @param bool $leavename Whether to keep the post name. |
---|
49 | */ |
---|
50 | $permalink = apply_filters( 'pre_post_link', $permalink, $post, $leavename ); |
---|
51 | |
---|
52 | if ( '' != $permalink && !in_array($post->post_status, array('draft', 'pending', 'auto-draft')) ) { |
---|
53 | $unixtime = strtotime($post->post_date); |
---|
54 | |
---|
55 | $category = ''; |
---|
56 | if ( strpos($permalink, '%category%') !== false ) { |
---|
57 | $cats = get_the_category($post->ID); |
---|
58 | if ( $cats ) { |
---|
59 | usort($cats, '_usort_terms_by_ID'); // order by ID |
---|
60 | |
---|
61 | /** |
---|
62 | * Filter the category that gets used in the %category% permalink token. |
---|
63 | * |
---|
64 | * @since 3.5.0 |
---|
65 | * |
---|
66 | * @param stdClass $cat The category to use in the permalink. |
---|
67 | * @param array $cats Array of all categories associated with the post. |
---|
68 | * @param WP_Post $post The post in question. |
---|
69 | */ |
---|
70 | $category_object = apply_filters( 'post_link_category', $cats[0], $cats, $post ); |
---|
71 | |
---|
72 | $category_object = get_term( $category_object, 'category' ); |
---|
73 | $category = $category_object->slug; |
---|
74 | if ( $parent = $category_object->parent ) |
---|
75 | $category = get_category_parents($parent, false, '/', true) . $category; |
---|
76 | } |
---|
77 | // show default category in permalinks, without |
---|
78 | // having to assign it explicitly |
---|
79 | if ( empty($category) ) { |
---|
80 | $default_category = get_term( get_option( 'default_category' ), 'category' ); |
---|
81 | $category = is_wp_error( $default_category ) ? '' : $default_category->slug; |
---|
82 | } |
---|
83 | } |
---|
84 | |
---|
85 | $author = ''; |
---|
86 | if ( strpos($permalink, '%author%') !== false ) { |
---|
87 | $authordata = get_userdata($post->post_author); |
---|
88 | $author = $authordata->user_nicename; |
---|
89 | } |
---|
90 | |
---|
91 | $date = explode(" ",date('Y m d H i s', $unixtime)); |
---|
92 | $rewritereplace = |
---|
93 | array( |
---|
94 | $date[0], |
---|
95 | $date[1], |
---|
96 | $date[2], |
---|
97 | $date[3], |
---|
98 | $date[4], |
---|
99 | $date[5], |
---|
100 | $post->post_name, |
---|
101 | $post->ID, |
---|
102 | $category, |
---|
103 | $author, |
---|
104 | $post->post_name, |
---|
105 | ); |
---|
106 | $permalink = home_url( str_replace($rewritecode, $rewritereplace, $permalink) ); |
---|
107 | $permalink = user_trailingslashit($permalink, 'single'); |
---|
108 | } else { // if they're not using the fancy permalink option |
---|
109 | $permalink = home_url('?p=' . $post->ID); |
---|
110 | } |
---|
111 | |
---|
112 | /** |
---|
113 | * Filter the permalink for a post. |
---|
114 | * |
---|
115 | * Only applies to posts with post_type of 'post'. |
---|
116 | * |
---|
117 | * @since 1.5.0 |
---|
118 | * |
---|
119 | * @param string $permalink The post's permalink. |
---|
120 | * @param WP_Post $post The post in question. |
---|
121 | * @param bool $leavename Whether to keep the post name. |
---|
122 | */ |
---|
123 | return apply_filters( 'post_link', $permalink, $post, $leavename ); |
---|
124 | } |
---|
125 | |
---|
126 | |
---|
127 | $count = 100000; |
---|
128 | |
---|
129 | $page = get_post( 2 ); |
---|
130 | |
---|
131 | timer_start(); |
---|
132 | for ( $i = 0; $i < $count; $i++ ) { |
---|
133 | $link = get_permalink( $page ); |
---|
134 | } |
---|
135 | printf( 'get_permalink(): %s seconds<br />', timer_stop( 0, 3 ) ); |
---|
136 | |
---|
137 | timer_start(); |
---|
138 | for ( $i = 0; $i < $count; $i++ ) { |
---|
139 | $link = get_permalink_with_obj( $page ); |
---|
140 | } |
---|
141 | printf( 'get_permalink_with_obj(): %s seconds<br />', timer_stop( 0, 3 ) ); |
---|