1 | <?php
|
---|
2 | /*
|
---|
3 | Plugin Name: Jerome's Keywords
|
---|
4 | Plugin URI: http://vapourtrails.ca/wp-keywords
|
---|
5 | Version: 1.9
|
---|
6 | Description: Allows keywords to be associated with each post. These keywords can be used for page meta tags, included in posts for site searching or linked like Technorati tags.
|
---|
7 | Author: Jerome Lavigne
|
---|
8 | Author URI: http://vapourtrails.ca
|
---|
9 | */
|
---|
10 |
|
---|
11 | /* Copyright 2005 Jerome Lavigne (email : darkcanuck@vapourtrails.ca)
|
---|
12 |
|
---|
13 | This program is free software; you can redistribute it and/or modify
|
---|
14 | it under the terms of the GNU General Public License as published by
|
---|
15 | the Free Software Foundation; either version 2 of the License, or
|
---|
16 | (at your option) any later version.
|
---|
17 |
|
---|
18 | This program is distributed in the hope that it will be useful,
|
---|
19 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
20 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
21 | GNU General Public License for more details.
|
---|
22 |
|
---|
23 | You should have received a copy of the GNU General Public License
|
---|
24 | along with this program; if not, write to the Free Software
|
---|
25 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
---|
26 | */
|
---|
27 |
|
---|
28 | /* Credits:
|
---|
29 | Special thanks also to Dave Metzener, Mark Eckenrode, Dan Taarin, N. Godbout, "theanomaly", "oso", Wayne @ AcmeTech, Will Luke,
|
---|
30 | Gyu-In Lee, Denis de Bernardy and the many others who have provided feedback, spotted bugs, and suggested improvements.
|
---|
31 | WP2.0 compatibility fixes suggested by Horst Gutmann.
|
---|
32 | */
|
---|
33 |
|
---|
34 | /* ChangeLog:
|
---|
35 |
|
---|
36 | 29-Dec-2005: Version 1.9
|
---|
37 | - Added support for WordPress 2.0 (which unnecessarily broke things)
|
---|
38 |
|
---|
39 | 23-Jun-2005: Version 1.8
|
---|
40 | - Fixed bug in get_the_post_keytag() that did not return a valid category link.
|
---|
41 |
|
---|
42 | 20-Jun-2005: Version 1.7
|
---|
43 | - Fixed uksort bug that appeared on the edit page when there are no keywords in the database.
|
---|
44 | - Fixed divide-by-zero error in all_keywords() scaling routine.
|
---|
45 | - Local keyword search now includes pages
|
---|
46 | - Added ability to create flickr- and del.icio.us-safe keyword links for use in cosmos/top-X keywords lists.
|
---|
47 |
|
---|
48 | 9-May-2005: Version 1.6
|
---|
49 | - Tag cosmos now uses a natural case-insensitive sort.
|
---|
50 | - Added a very simple keyword suggestion feature when editing posts (suggestions refresh after every save)
|
---|
51 |
|
---|
52 | 16-Apr-2005: Version 1.5
|
---|
53 | - Added functions all_keywords() and get_all_keywords() for creating a "tag cosmos".
|
---|
54 | - Added functions top_keywords() and get_top_keywords() to return a "Top X Tags" list.
|
---|
55 | - Fixed slashes bug in get_the_search_keytag().
|
---|
56 | - Fixed get_the_keywords() routine:
|
---|
57 | - no longer lists duplicate keywords
|
---|
58 | - only relevant categories are output, except on the home page where all are shown (can be overridden with parameters)
|
---|
59 | - Added filter for adding keywords to pages.
|
---|
60 | - Added fix for conflicting JOINs on wp_postmeta (or how to make friends with other plugins) and removed mini-posts "fix"
|
---|
61 |
|
---|
62 | 13-Mar-2005: Version 1.4
|
---|
63 | - Added ability to automatically generate .htaccess rewrite rules for keyword searches.
|
---|
64 | - Can be turned off with new KEYWORDS_REWRITERULES flag.
|
---|
65 | - Necessary for sites that use /index.php/*%blah% style permalinks
|
---|
66 | - Thanks to Dave Metzener for finding the original bug and beta testing the fix.
|
---|
67 | - Added formatting parameters to the_keywords() and get_the_keywords() to allow more control over the output.
|
---|
68 | - Fixed XHTML validation bug: added a space prior to title attribute in keyword links.
|
---|
69 | - Fixed keyword link encoding for links that include '/' (now left as-is rather than encoded)
|
---|
70 | - Temporary fix to prevent conflicts with mini-posts plugin: removes mini-post's filters when a tag search is performed.
|
---|
71 |
|
---|
72 | 1-Mar-2005: Version 1.3
|
---|
73 | - Added ability to do site keyword searches. This now the default keyword link behaviour.
|
---|
74 | - Keyword search can also use its own template file.
|
---|
75 | - If including categories, local links will return that category (not the keyword search).
|
---|
76 | - Added filter for Atom feed content if not sending rss summaries only.
|
---|
77 |
|
---|
78 | 27-Feb-2005: Version 1.2
|
---|
79 | - Fixed search URL for sites not using permalinks (this is automatically detected)
|
---|
80 | - If not using permalinks then the Atom feed will contain Technorati links instead of local search link (local search can't be parsed by Technorati)
|
---|
81 |
|
---|
82 | 26-Feb-2005: Version 1.1
|
---|
83 | - added ability to suppress link title if value passed is an empty string (used for Atom feed)
|
---|
84 | - updated keywords_appendtags() to suppress link title.
|
---|
85 |
|
---|
86 | 25-Feb-2005: Version 1.0 publicly released
|
---|
87 |
|
---|
88 | */
|
---|
89 |
|
---|
90 | /* *****INSTRUCTIONS*****
|
---|
91 |
|
---|
92 | Entering Keywords - simply type all of your keywords into the keywords field when creating/editing posts. Keywords
|
---|
93 | should be separated by commas and can include spaces (key phrases).
|
---|
94 |
|
---|
95 | Template Tags - you can use the following php template tags to insert the keywords into your template
|
---|
96 |
|
---|
97 | the_keywords() - can be used outside the loop
|
---|
98 | Outputs a comma-separated list of all categories & keywords on the current page. You can use this
|
---|
99 | to add a keyword meta tag to your page's title block:
|
---|
100 | <meta name="keywords" content="<?php the_keywords(); ?>" />
|
---|
101 |
|
---|
102 | This function can take three optional parameters:
|
---|
103 | before (default = blank) - text/html to insert before each keyword
|
---|
104 | after (default = blank) - text/html to insert after each keyword
|
---|
105 | separator (default = ",") - text/html to insert between keywords
|
---|
106 | get_the_keywords() is a non-echoing version
|
---|
107 |
|
---|
108 | the_post_keywords() - must be used inside the loop
|
---|
109 | Outputs a comma-separated list of the keywords for the current post. This function can take one optional parameters:
|
---|
110 | include_cats (default=false) - if true, post categories are included in the list.
|
---|
111 | get_the_post_keywords() is a non-echoing version.
|
---|
112 |
|
---|
113 | the_post_keytags() - must be used inside the loop
|
---|
114 | Outputs the keywords for the current post as a series of links. By default these link a query for other posts with matching
|
---|
115 | keywords (can also link to the WordPress search function or to Technorati's page for that tag)
|
---|
116 | This function can take three optional parameters:
|
---|
117 | include_cats (default=false) - if true, post categories are included in the list.
|
---|
118 | local_search (default="tag") - if false or "technorati", the links will be to Technorati's tag page for the keyword instead,
|
---|
119 | if "search", the links will be to the local Wordpress search function.
|
---|
120 | link_title (default="") - alternate link title text to use, e.g. "My link title for" (tag name will be added at the end)
|
---|
121 |
|
---|
122 | An example from my site:
|
---|
123 | <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
|
---|
124 | [...]
|
---|
125 | <div class="post">
|
---|
126 | [...]
|
---|
127 | <div class="subtags">
|
---|
128 | >>> Tags: <?php the_post_keytags(); ?>
|
---|
129 | </div>
|
---|
130 | [...]
|
---|
131 | <?php endwhile; else: ?>
|
---|
132 |
|
---|
133 | get_the_post_keytags() is a non-echoing version.
|
---|
134 |
|
---|
135 | is_keyword() - can be used outside the loop
|
---|
136 | Returns true if the current view is a keyword/tag search
|
---|
137 |
|
---|
138 | the_search_keytag() - can be used outside the loop
|
---|
139 | Outputs the keyword/tag used for the search
|
---|
140 | get_the_search_keytag() is a non-echoing version
|
---|
141 |
|
---|
142 |
|
---|
143 | Rewrite Rules - The plugin can generate new tag search rewrite rules automatically. You need to
|
---|
144 | re-save your permalinks settings (Options -> Permalinks) for this to occur.
|
---|
145 | If your .htaccess file cannot be written to by WordPress, add the following to your
|
---|
146 | .htaccess file to use the tag search feature, preferably below the "# END WordPress" line:
|
---|
147 |
|
---|
148 | RewriteRule ^tag/(.+)/feed/(feed|rdf|rss|rss2|atom)/?$ /index.php?tag=$1&feed=$2 [QSA,L]
|
---|
149 | RewriteRule ^tag/(.+)/(feed|rdf|rss|rss2|atom)/?$ /index.php?tag=$1&feed=$2 [QSA,L]
|
---|
150 | RewriteRule ^tag/(.+)/page/?([0-9]{1,})/?$ /index.php?tag=$1&paged=$2 [QSA,L]
|
---|
151 | RewriteRule ^tag/(.+)/?$ /index.php?tag=$1 [QSA,L]
|
---|
152 |
|
---|
153 | */
|
---|
154 |
|
---|
155 |
|
---|
156 | /* You can change these constants if you wish for further customization*/
|
---|
157 | define('KEYWORDS_META', 'keywords'); // post meta key used in the wp database
|
---|
158 | define('KEYWORDS_TECHNORATI', 'http://technorati.com/tag'); // Technorati link to use if local search is false
|
---|
159 | define('KEYWORDS_ATOMTAGSON', '1'); // flag to add tags to Atom feed (required for Technorati)
|
---|
160 | define('KEYWORDS_QUERYVAR', 'tag'); // get/post variable name for querying tag/keyword from WP
|
---|
161 | define('KEYWORDS_TAGURL', 'tag'); // URL to use when querying tags
|
---|
162 | define('KEYWORDS_TEMPLATE', 'keywords.php'); // template file to use for displaying tag queries
|
---|
163 | define('KEYWORDS_SEARCHURL', 'search'); // local search URL (from mod_rewrite rules)
|
---|
164 | define('KEYWORDS_REWRITERULES', '1'); // flag to determine if plugin can change WP rewrite rules
|
---|
165 | define('KEYWORDS_SUGGESTED', '8'); // maximum number of keywords suggested
|
---|
166 |
|
---|
167 | /* WP 2.0 doesn't initialize the rewrite object before plugins are loaded anymore
|
---|
168 | so these constants are set later
|
---|
169 | */
|
---|
170 | function keywords_init() {
|
---|
171 | global $wp_rewrite;
|
---|
172 |
|
---|
173 | /* Shouldn't need to change this - can set to 0 if you want to force permalinks off */
|
---|
174 | if (isset($wp_rewrite) && $wp_rewrite->using_permalinks()) {
|
---|
175 | define('KEYWORDS_REWRITEON', '1'); // nice permalinks, yes please!
|
---|
176 | define('KEYWORDS_LINKBASE', $wp_rewrite->root); // set to "index.php/" if using that style
|
---|
177 | } else {
|
---|
178 | define('KEYWORDS_REWRITEON', '0'); // old school links
|
---|
179 | define('KEYWORDS_LINKBASE', ''); // don't need this
|
---|
180 | }
|
---|
181 |
|
---|
182 | /* generate rewrite rules for above queries */
|
---|
183 | if (KEYWORDS_REWRITEON && KEYWORDS_REWRITERULES)
|
---|
184 | add_filter('search_rewrite_rules', 'keywords_createRewriteRules');
|
---|
185 | }
|
---|
186 | add_action('init','keywords_init');
|
---|
187 |
|
---|
188 | /* use in the loop*/
|
---|
189 | function get_the_post_keywords($include_cats=true) {
|
---|
190 | $keywords = '';
|
---|
191 |
|
---|
192 | if ($include_cats) {
|
---|
193 | $categories = get_the_category();
|
---|
194 | foreach($categories as $category) {
|
---|
195 | if (!empty($keywords))
|
---|
196 | $keywords .= ",";
|
---|
197 | $keywords .= $category->cat_name;
|
---|
198 | }
|
---|
199 | }
|
---|
200 |
|
---|
201 | $post_keywords = get_post_custom_values(KEYWORDS_META);
|
---|
202 | if (is_array($post_keywords)) {
|
---|
203 | foreach($post_keywords as $post_keys) {
|
---|
204 | if (!empty($post_keys))
|
---|
205 | $keywords .= ",";
|
---|
206 | $keywords .= $post_keys;
|
---|
207 | }
|
---|
208 | }
|
---|
209 | return( $keywords );
|
---|
210 | }
|
---|
211 |
|
---|
212 | /* use in the loop*/
|
---|
213 | function the_post_keywords($include_cats=true) {
|
---|
214 | echo get_the_post_keywords($include_cats);
|
---|
215 | }
|
---|
216 |
|
---|
217 | /* use in the loop*/
|
---|
218 | function get_the_post_keytags($include_cats=false, $localsearch="tag", $linktitle=false) {
|
---|
219 | // determine link mode
|
---|
220 | $linkmode = strtolower(trim($localsearch));
|
---|
221 | switch ($linkmode) {
|
---|
222 | case '':
|
---|
223 | case 'technorati':
|
---|
224 | $linkmode = 'technorati';
|
---|
225 | break;
|
---|
226 | case 'search':
|
---|
227 | $linkmode = 'search';
|
---|
228 | break;
|
---|
229 | //case 'tag':
|
---|
230 | //case 'keyword':
|
---|
231 | default:
|
---|
232 | $linkmode = 'tag';
|
---|
233 | break;
|
---|
234 | }
|
---|
235 |
|
---|
236 | $output = "";
|
---|
237 | if ($linktitle === false)
|
---|
238 | $linktitle = ($linkmode == 'technorati') ? "Technorati tag page for" : "Search site for";
|
---|
239 |
|
---|
240 | // do categories separately to get category links instead of tag links
|
---|
241 | if ($include_cats) {
|
---|
242 | $categories = get_the_category();
|
---|
243 | foreach($categories as $category) {
|
---|
244 | $keyword = $category->cat_name;
|
---|
245 | if ($linkmode == 'technorati')
|
---|
246 | $taglink = KEYWORDS_TECHNORATI . "/" . jkeywords_localLink($keyword);
|
---|
247 | else
|
---|
248 | $taglink = get_category_link($category->cat_ID);
|
---|
249 | $tagtitle = empty($linktitle) ? "" : " title=\"$linktitle $keyword\"";
|
---|
250 |
|
---|
251 | if (!empty($output))
|
---|
252 | $output .= ", ";
|
---|
253 | $output .= "<a href=\"$taglink\" rel=\"tag\"$tagtitle>$keyword</a>";
|
---|
254 | }
|
---|
255 | }
|
---|
256 |
|
---|
257 | $post_keywords = get_post_custom_values(KEYWORDS_META);
|
---|
258 | if (is_array($post_keywords)) {
|
---|
259 | $keywordlist = array();
|
---|
260 | foreach($post_keywords as $post_keys)
|
---|
261 | $keywordlist = array_merge($keywordlist, explode(",", $post_keys));
|
---|
262 |
|
---|
263 | foreach($keywordlist as $keyword) {
|
---|
264 | $keyword = trim($keyword);
|
---|
265 | if (!empty($keyword)) {
|
---|
266 | switch ($linkmode) {
|
---|
267 | case 'tag':
|
---|
268 | if (KEYWORDS_REWRITEON)
|
---|
269 | $taglink = get_settings('home') . '/' . KEYWORDS_LINKBASE . KEYWORDS_TAGURL .
|
---|
270 | '/' . jkeywords_localLink($keyword);
|
---|
271 | else
|
---|
272 | $taglink = get_settings('home') . "/?" . KEYWORDS_TAGURL . "=" . urlencode($keyword);
|
---|
273 | break;
|
---|
274 | case 'technorati':
|
---|
275 | $taglink = KEYWORDS_TECHNORATI . "/" . jkeywords_localLink($keyword);
|
---|
276 | break;
|
---|
277 | case 'search':
|
---|
278 | if (KEYWORDS_REWRITEON)
|
---|
279 | $taglink = get_settings('home') . '/' . KEYWORDS_LINKBASE . KEYWORDS_SEARCHURL .
|
---|
280 | '/' . jkeywords_localLink($keyword);
|
---|
281 | else
|
---|
282 | $taglink = get_settings('home') . '/?s=' . urlencode($keyword) . '&submit=Search';
|
---|
283 | break;
|
---|
284 | }
|
---|
285 | $tagtitle = empty($linktitle) ? "" : " title=\"$linktitle $keyword\"";
|
---|
286 |
|
---|
287 | if (!empty($output))
|
---|
288 | $output .= ", ";
|
---|
289 | $output .= "<a href=\"$taglink\" rel=\"tag\"$tagtitle>$keyword</a>";
|
---|
290 | }
|
---|
291 | }
|
---|
292 | }
|
---|
293 | return($output);
|
---|
294 | }
|
---|
295 |
|
---|
296 | /* use in the loop*/
|
---|
297 | function the_post_keytags($include_cats=false, $localsearch=true, $linktitle=false) {
|
---|
298 | $taglist = get_the_post_keytags($include_cats, $localsearch, $linktitle);
|
---|
299 |
|
---|
300 | if (empty($taglist))
|
---|
301 | echo "none";
|
---|
302 | else
|
---|
303 | echo $taglist;
|
---|
304 | }
|
---|
305 |
|
---|
306 | /* works outside the loop*/
|
---|
307 | function get_the_keywords($before='', $after='', $separator=',', $include_cats='default') {
|
---|
308 | global $cache_categories, $category_cache, $post_meta_cache;
|
---|
309 |
|
---|
310 | $keywords = "";
|
---|
311 |
|
---|
312 | if ($include_cats) {
|
---|
313 | if ( isset($cache_categories) && ( ($include_cats == 'all') ||
|
---|
314 | (($include_cats == 'default') && is_home()) ) ) {
|
---|
315 | foreach($cache_categories as $category)
|
---|
316 | $keywordarray[$category->cat_name] += 1;
|
---|
317 | } elseif (isset($category_cache)) {
|
---|
318 | foreach($category_cache as $post_category) {
|
---|
319 | foreach($post_category as $category)
|
---|
320 | $keywordarray[$category->cat_name] += 1;
|
---|
321 | }
|
---|
322 | }
|
---|
323 | }
|
---|
324 |
|
---|
325 | if (isset($post_meta_cache)) {
|
---|
326 | foreach($post_meta_cache as $post_meta) {
|
---|
327 | if (is_array($post_meta[KEYWORDS_META])) {
|
---|
328 | foreach($post_meta[KEYWORDS_META] as $post_keys) {
|
---|
329 | $keywordlist = explode(",", $post_keys);
|
---|
330 | foreach($keywordlist as $keyvalue)
|
---|
331 | if (!empty($keyvalue))
|
---|
332 | $keywordarray[$keyvalue] += 1;
|
---|
333 | }
|
---|
334 | }
|
---|
335 | }
|
---|
336 | }
|
---|
337 |
|
---|
338 | if (is_array($keywordarray)) {
|
---|
339 | foreach($keywordarray as $key => $count) {
|
---|
340 | if (!empty($keywords))
|
---|
341 | $keywords .= $separator;
|
---|
342 | $keywords .= $before . $key . $after;
|
---|
343 | }
|
---|
344 | }
|
---|
345 |
|
---|
346 | return ($keywords);
|
---|
347 | }
|
---|
348 |
|
---|
349 | /* works outside the loop */
|
---|
350 | function the_keywords($before='', $after='', $separator=',') {
|
---|
351 | echo get_the_keywords($before, $after, $separator);
|
---|
352 | }
|
---|
353 |
|
---|
354 | function is_keyword() {
|
---|
355 | global $wp_version;
|
---|
356 | $keyword = ( isset($wp_version) && ($wp_version >= 2.0) ) ?
|
---|
357 | get_query_var(KEYWORDS_QUERYVAR) :
|
---|
358 | $GLOBALS[KEYWORDS_QUERYVAR];
|
---|
359 | if (!is_null($keyword) && ($keyword != ''))
|
---|
360 | return true;
|
---|
361 | else
|
---|
362 | return false;
|
---|
363 | }
|
---|
364 |
|
---|
365 | function get_the_search_keytag() {
|
---|
366 | $keyword = ( isset($wp_version) && ($wp_version >= 2.0) ) ?
|
---|
367 | get_query_var(KEYWORDS_QUERYVAR) :
|
---|
368 | $GLOBALS[KEYWORDS_QUERYVAR];
|
---|
369 | $searchtag = stripslashes($keyword);
|
---|
370 | return(get_magic_quotes_gpc() ? stripslashes($searchtag) : $searchtag);
|
---|
371 | }
|
---|
372 |
|
---|
373 | function the_search_keytag() {
|
---|
374 | echo get_the_search_keytag();
|
---|
375 | }
|
---|
376 |
|
---|
377 |
|
---|
378 | /***** Tag cosmos functions *****/
|
---|
379 | function get_all_keywords($include_cats = false) {
|
---|
380 | global $wpdb, $cache_categories;
|
---|
381 |
|
---|
382 | if ($include_cats && isset($cache_categories)) {
|
---|
383 | $catkeys = $wpdb->get_results("SELECT p2c.category_id AS cat_id, COUNT(p2c.rel_id) AS cat_count
|
---|
384 | FROM $wpdb->post2cat p2c, $wpdb->posts posts
|
---|
385 | WHERE posts.ID = p2c.post_id
|
---|
386 | AND posts.post_status IN('publish', 'static')
|
---|
387 | GROUP BY p2c.category_id");
|
---|
388 | if (is_array($catkeys)) {
|
---|
389 | foreach($catkeys as $category)
|
---|
390 | $keywordarray[ $cache_categories[$category->cat_id]->cat_name .
|
---|
391 | '::Category::' . $category->cat_id ] += $category->cat_count;
|
---|
392 | }
|
---|
393 | }
|
---|
394 |
|
---|
395 | $metakeys = $wpdb->get_results("SELECT meta.meta_id, meta.meta_value
|
---|
396 | FROM $wpdb->posts posts, $wpdb->postmeta meta
|
---|
397 | WHERE posts.ID = meta.post_id
|
---|
398 | AND posts.post_status IN('publish', 'static')
|
---|
399 | AND meta.meta_key = '" . KEYWORDS_META . "'");
|
---|
400 | if (is_array($metakeys)) {
|
---|
401 | foreach($metakeys as $post_meta) {
|
---|
402 | if (!empty($post_meta->meta_value)) {
|
---|
403 | $post_keys = explode(',', $post_meta->meta_value);
|
---|
404 |
|
---|
405 | foreach($post_keys as $keyword) {
|
---|
406 | $keyword = trim($keyword);
|
---|
407 | if (!empty($keyword))
|
---|
408 | $keywordarray[ $keyword ] += 1;
|
---|
409 | }
|
---|
410 | }
|
---|
411 | }
|
---|
412 | }
|
---|
413 |
|
---|
414 | if(is_array($keywordarray))
|
---|
415 | uksort($keywordarray, 'strnatcasecmp');
|
---|
416 |
|
---|
417 | return($keywordarray);
|
---|
418 | }
|
---|
419 |
|
---|
420 | function jkeywords_localLink($keyword) {
|
---|
421 | return str_replace('%2F', '/', urlencode($keyword));
|
---|
422 | }
|
---|
423 |
|
---|
424 | function jkeywords_flickrLink($keyword) {
|
---|
425 | return urlencode(preg_replace('/[^a-zA-Z0-9]/', '', strtolower($keyword)));
|
---|
426 | }
|
---|
427 |
|
---|
428 | function jkeywords_deliciousLink($keyword) {
|
---|
429 | $del = preg_replace('/\s/', '', $keyword);
|
---|
430 | if (strstr($del, '+'))
|
---|
431 | $del = '"' . $del . '"';
|
---|
432 | return str_replace('%2F', '/', rawurlencode($del));
|
---|
433 | }
|
---|
434 |
|
---|
435 | function all_keywords($element = '<li class="cosmos keyword%count%"><a href="/tag/%keylink%">%keyword%</a></li>',
|
---|
436 | $element_cat = '', $min_scale = 1, $max_scale = false, $min_include = 0) {
|
---|
437 |
|
---|
438 | $include_cats = !empty($element_cat);
|
---|
439 |
|
---|
440 | $allkeys = get_all_keywords($include_cats);
|
---|
441 |
|
---|
442 | $keywords = '';
|
---|
443 | if (is_array($allkeys)) {
|
---|
444 |
|
---|
445 | // scaling
|
---|
446 | if ($max_scale !== false) {
|
---|
447 | $pre_scale = min($allkeys);
|
---|
448 | $pre_scale = ($pre_scale < $min_include) ? $min_include : $pre_scale;
|
---|
449 | $spread = (max($allkeys) - $pre_scale);
|
---|
450 | $spread = ($spread > 0 ? $spread : 1);
|
---|
451 | $scale_factor = ($max_scale - $min_scale) / $spread;
|
---|
452 | }
|
---|
453 |
|
---|
454 | foreach($allkeys as $key => $count) {
|
---|
455 | if ($count >= $min_include) {
|
---|
456 | if ($max_scale !== false)
|
---|
457 | $keycount = (int) (($count - $pre_scale) * $scale_factor + $min_scale);
|
---|
458 | else
|
---|
459 | $keycount = $count + $min_scale - 1;
|
---|
460 |
|
---|
461 | // need to do category stuff first so that we can decide between $element and $element_cat at the outset
|
---|
462 | if ($include_cats && (strstr($key, '::Category::'))) {
|
---|
463 | $keycat = explode('::Category::', $key);
|
---|
464 | $key = $keycat[0];
|
---|
465 | $keytemp = str_replace('%keylink%', get_category_link((int)$keycat[1]), $element_cat);
|
---|
466 | $keytemp = str_replace('%flickr%', get_category_link((int)$keycat[1]), $keytemp);
|
---|
467 | $keytemp = str_replace('%delicious%', get_category_link((int)$keycat[1]), $keytemp);
|
---|
468 | } else {
|
---|
469 | $keytemp = str_replace('%keylink%', jkeywords_localLink($key), $element);
|
---|
470 | $keytemp = str_replace('%flickr%', jkeywords_flickrLink($key), $keytemp);
|
---|
471 | $keytemp = str_replace('%delicious%', jkeywords_deliciousLink($key), $keytemp);
|
---|
472 | }
|
---|
473 | $keytemp = str_replace('%count%', $keycount, $keytemp);
|
---|
474 | if (strstr($keytemp, '%em%')) {
|
---|
475 | $keytemp = str_replace('%em%', str_repeat('<em>', $keycount), $keytemp);
|
---|
476 | $keytemp = str_replace('%/em%', str_repeat('</em>', $keycount), $keytemp);
|
---|
477 | }
|
---|
478 | $keytemp = str_replace('%keyword%', str_replace(' ', ' ', $key), $keytemp);
|
---|
479 | $keywords .= $keytemp . ' ';
|
---|
480 | }
|
---|
481 | }
|
---|
482 | }
|
---|
483 | echo $keywords;
|
---|
484 | }
|
---|
485 |
|
---|
486 |
|
---|
487 | /***** Top keywords/tags functions *****/
|
---|
488 | function get_top_keywords($number = false, $include_cats = false, $min_include = 0) {
|
---|
489 |
|
---|
490 | $allkeys = get_all_keywords($include_cats);
|
---|
491 |
|
---|
492 | $topkeys = array();
|
---|
493 | if (is_array($allkeys)) {
|
---|
494 |
|
---|
495 | arsort($allkeys);
|
---|
496 | if (($number <= 0) && ($min_include <= 1))
|
---|
497 | return($allkeys);
|
---|
498 |
|
---|
499 | $topcount = 0;
|
---|
500 | foreach ($allkeys as $key => $count) {
|
---|
501 | if ($count >= $min_include) {
|
---|
502 | $topkeys[$key] = $count;
|
---|
503 | $topcount++;
|
---|
504 | }
|
---|
505 | if (($number > 0) && ($topcount >= $number))
|
---|
506 | break;
|
---|
507 | }
|
---|
508 | }
|
---|
509 | return($topkeys);
|
---|
510 | }
|
---|
511 |
|
---|
512 | function top_keywords($number = false, $element='<li><a href="/tag/%keylink%">%keyword%</a></li>',
|
---|
513 | $element_cat = '', $min_include = 0) {
|
---|
514 |
|
---|
515 | $include_cats = !empty($element_cat);
|
---|
516 |
|
---|
517 | $topkeys = get_top_keywords($number, $include_cats, $min_include);
|
---|
518 |
|
---|
519 | $keywords = '';
|
---|
520 | if (is_array($topkeys)) {
|
---|
521 | foreach($topkeys as $key => $count) {
|
---|
522 | // need to do category stuff first so that we can decide between $element and $element_cat at the outset
|
---|
523 | if ($include_cats && (strstr($key, '::Category::'))) {
|
---|
524 | $keycat = explode('::Category::', $key);
|
---|
525 | $key = $keycat[0];
|
---|
526 | $keytemp = str_replace('%keylink%', get_category_link((int)$keycat[1]), $element_cat);
|
---|
527 | $keytemp = str_replace('%flickr%', get_category_link((int)$keycat[1]), $keytemp);
|
---|
528 | $keytemp = str_replace('%delicious%', get_category_link((int)$keycat[1]), $keytemp);
|
---|
529 | } else {
|
---|
530 | $keytemp = str_replace('%keylink%', jkeywords_localLink($key), $element);
|
---|
531 | $keytemp = str_replace('%flickr%', jkeywords_flickrLink($key), $keytemp);
|
---|
532 | $keytemp = str_replace('%delicious%', jkeywords_deliciousLink($key), $keytemp);
|
---|
533 | }
|
---|
534 |
|
---|
535 | $keytemp = str_replace('%count%', $count, $keytemp);
|
---|
536 | if (strstr($keytemp, '%em%')) {
|
---|
537 | $keytemp = str_replace('%em%', str_repeat('<em>', $keycount), $keytemp);
|
---|
538 | $keytemp = str_replace('%/em%', str_repeat('</em>', $keycount), $keytemp);
|
---|
539 | }
|
---|
540 | $keytemp = str_replace('%keyword%', str_replace(' ', ' ', $key), $keytemp);
|
---|
541 | $keywords .= $keytemp . ' ';
|
---|
542 | }
|
---|
543 | }
|
---|
544 | echo $keywords;
|
---|
545 | }
|
---|
546 |
|
---|
547 |
|
---|
548 | /***** Add actions *****/
|
---|
549 |
|
---|
550 | /* editing */
|
---|
551 | add_filter('simple_edit_form', 'keywords_edit_form');
|
---|
552 | add_filter('edit_form_advanced', 'keywords_edit_form');
|
---|
553 | add_filter('edit_page_form', 'keywords_edit_form');
|
---|
554 | add_action('edit_post', 'keywords_update');
|
---|
555 | add_action('publish_post', 'keywords_update');
|
---|
556 | add_action('save_post', 'keywords_update');
|
---|
557 |
|
---|
558 | /* for keyword/tag queries */
|
---|
559 | add_filter('query_vars', 'keywords_addQueryVar');
|
---|
560 | add_action('parse_query', 'keywords_parseQuery');
|
---|
561 |
|
---|
562 | /* Atom feed */
|
---|
563 | if (KEYWORDS_ATOMTAGSON) {
|
---|
564 | add_filter('the_excerpt_rss', 'keywords_appendTags');
|
---|
565 | if (!get_settings('rss_use_excerpt'))
|
---|
566 | add_filter('the_content', 'keywords_appendTags');
|
---|
567 | }
|
---|
568 |
|
---|
569 | /***** Callback functions *****/
|
---|
570 | function keywords_edit_form() {
|
---|
571 | global $post, $postdata, $content;
|
---|
572 |
|
---|
573 | $id = isset($post) ? $post->ID : $postdata->ID;
|
---|
574 | $post_keywords = get_post_meta($id, KEYWORDS_META, true);
|
---|
575 |
|
---|
576 | echo "
|
---|
577 | <fieldset id=\"postkeywords\">
|
---|
578 | <legend>Keywords</legend>
|
---|
579 | <div>
|
---|
580 | <textarea rows=\"1\" cols=\"40\" name=\"keywords_list\" tabindex=\"4\" id=\"keywords_list\" style=\"margin-left: 1%; width: 97%; height: 1.8em;\">$post_keywords</textarea>
|
---|
581 | ";
|
---|
582 |
|
---|
583 | if (KEYWORDS_SUGGESTED > 0) {
|
---|
584 | $top_keywords = get_top_keywords();
|
---|
585 |
|
---|
586 | $suggested = array();
|
---|
587 |
|
---|
588 | foreach($top_keywords as $keyword=>$keycount) {
|
---|
589 | if (stristr($content, $keyword)) {
|
---|
590 | $suggested[] = $keyword;
|
---|
591 | if (count($suggested) >= KEYWORDS_SUGGESTED)
|
---|
592 | break;
|
---|
593 | }
|
---|
594 | }
|
---|
595 | if (count($suggested) < KEYWORDS_SUGGESTED) {
|
---|
596 | foreach($top_keywords as $keyword=>$keycount) {
|
---|
597 | if (!in_array($keyword, $suggested)) {
|
---|
598 | $suggested[] = $keyword;
|
---|
599 | if (count($suggested) >= KEYWORDS_SUGGESTED)
|
---|
600 | break;
|
---|
601 | }
|
---|
602 | }
|
---|
603 | }
|
---|
604 | $suggested_keys = implode(', ', $suggested);
|
---|
605 | echo " <br /> <div style=\"font-size: 80%; margin-left: 1%;\">Suggested Keywords: <em>$suggested_keys</em> </div>";
|
---|
606 | }
|
---|
607 |
|
---|
608 | echo "
|
---|
609 | </div>
|
---|
610 | </fieldset>
|
---|
611 | ";
|
---|
612 | }
|
---|
613 |
|
---|
614 | function keywords_update($id) {
|
---|
615 |
|
---|
616 | // remove old value
|
---|
617 | delete_post_meta($id, KEYWORDS_META);
|
---|
618 |
|
---|
619 | // clean up keywords list & save
|
---|
620 | $keyword_list = "";
|
---|
621 | $post_keywords = explode(",", $_REQUEST['keywords_list']);
|
---|
622 | foreach($post_keywords as $keyword) {
|
---|
623 | if ( !empty($keyword ) ) {
|
---|
624 | if ( !empty($keyword_list) )
|
---|
625 | $keyword_list .= ",";
|
---|
626 | $keyword_list .= trim($keyword);
|
---|
627 | }
|
---|
628 | }
|
---|
629 |
|
---|
630 | if (!empty($keyword_list) )
|
---|
631 | add_post_meta($id, KEYWORDS_META, $keyword_list);
|
---|
632 | }
|
---|
633 |
|
---|
634 | function keywords_appendTags(&$text) {
|
---|
635 | global $doing_rss, $feed;
|
---|
636 |
|
---|
637 | if ( (!$doing_rss) || ($feed != 'atom') )
|
---|
638 | return($text);
|
---|
639 |
|
---|
640 | $local = KEYWORDS_REWRITEON ? "tag" : "technorati";
|
---|
641 |
|
---|
642 | $taglist = get_the_post_keytags(true, $local, "");
|
---|
643 | if (empty($taglist))
|
---|
644 | return($text);
|
---|
645 | else
|
---|
646 | return($text . " \n Tags: " . $taglist);
|
---|
647 | }
|
---|
648 |
|
---|
649 | function keywords_addQueryVar($wpvar_array) {
|
---|
650 | $wpvar_array[] = KEYWORDS_QUERYVAR;
|
---|
651 | return($wpvar_array);
|
---|
652 | }
|
---|
653 |
|
---|
654 | function keywords_parseQuery() {
|
---|
655 | // if this is a keyword query, then reset other is_x flags and add query filters
|
---|
656 | if (is_keyword()) {
|
---|
657 | global $wp_query;
|
---|
658 | $wp_query->is_single = false;
|
---|
659 | $wp_query->is_page = false;
|
---|
660 | $wp_query->is_archive = false;
|
---|
661 | $wp_query->is_search = false;
|
---|
662 | $wp_query->is_home = false;
|
---|
663 |
|
---|
664 | add_filter('posts_where', 'keywords_postsWhere');
|
---|
665 | add_filter('posts_join', 'keywords_postsJoin');
|
---|
666 | add_action('template_redirect', 'keywords_includeTemplate');
|
---|
667 | }
|
---|
668 | }
|
---|
669 |
|
---|
670 | function keywords_postsWhere($where) {
|
---|
671 | global $wp_version;
|
---|
672 | $keyword = ( isset($wp_version) && ($wp_version >= 2.0) ) ?
|
---|
673 | get_query_var(KEYWORDS_QUERYVAR) :
|
---|
674 | $GLOBALS[KEYWORDS_QUERYVAR];
|
---|
675 |
|
---|
676 | $where .= " AND jkeywords_meta.meta_key = '" . KEYWORDS_META . "' ";
|
---|
677 | $where .= " AND jkeywords_meta.meta_value LIKE '%" . $keyword . "%' ";
|
---|
678 |
|
---|
679 | // include pages in search (from jeromes-search.php)
|
---|
680 | $where = str_replace(' AND (post_status = "publish"', ' AND ((post_status = \'static\' OR post_status = \'publish\')', $where);
|
---|
681 |
|
---|
682 | return ($where);
|
---|
683 | }
|
---|
684 |
|
---|
685 | function keywords_postsJoin($join) {
|
---|
686 | global $wpdb;
|
---|
687 | $join .= " LEFT JOIN $wpdb->postmeta AS jkeywords_meta ON ($wpdb->posts.ID = jkeywords_meta.post_id) ";
|
---|
688 | return ($join);
|
---|
689 | }
|
---|
690 |
|
---|
691 | function keywords_includeTemplate() {
|
---|
692 |
|
---|
693 | if (is_keyword()) {
|
---|
694 | $template = '';
|
---|
695 |
|
---|
696 | if ( file_exists(TEMPLATEPATH . "/" . KEYWORDS_TEMPLATE) )
|
---|
697 | $template = TEMPLATEPATH . "/" . KEYWORDS_TEMPLATE;
|
---|
698 | else if ( file_exists(TEMPLATEPATH . "/tags.php") )
|
---|
699 | $template = TEMPLATEPATH . "/tags.php";
|
---|
700 | else
|
---|
701 | $template = get_category_template();
|
---|
702 |
|
---|
703 | if ($template) {
|
---|
704 | load_template($template);
|
---|
705 | exit;
|
---|
706 | }
|
---|
707 | }
|
---|
708 | return;
|
---|
709 | }
|
---|
710 |
|
---|
711 | function keywords_createRewriteRules($rewrite) {
|
---|
712 | global $wp_rewrite;
|
---|
713 |
|
---|
714 | // add rewrite tokens
|
---|
715 | $keytag_token = '%' . KEYWORDS_QUERYVAR . '%';
|
---|
716 | $wp_rewrite->add_rewrite_tag($keytag_token, '(.+)', KEYWORDS_QUERYVAR . '=');
|
---|
717 |
|
---|
718 | $keywords_structure = $wp_rewrite->root . KEYWORDS_QUERYVAR . "/$keytag_token";
|
---|
719 | $keywords_rewrite = $wp_rewrite->generate_rewrite_rules($keywords_structure);
|
---|
720 |
|
---|
721 | return ( $rewrite + $keywords_rewrite );
|
---|
722 | }
|
---|
723 |
|
---|
724 | ?>
|
---|