PluginProbe
FeedWordPress / 2017.1020
FeedWordPress v2017.1020
trunk 0.8 0.9 0.91 0.95 0.96 0.97 0.98 0.981 0.99 0.991 0.992 0.993 2008.1030 2008.1101 2008.1105 2008.1214 2009.0612 2009.0613 2009.0618 2009.0707 2009.1111 2009.1112 2010.0127 2010.0528 All 65 releases
← All changes | categories-page.php +551 -282 2009.06132017.1020 View file →
@@ -1,306 +1,357 @@
1 1 <?php
2 2 require_once(dirname(__FILE__) . '/admin-ui.php');
3 3
4 -function fwp_categories_page () {
5 - global $wpdb, $wp_db_version;
4 +class FeedWordPressCategoriesPage extends FeedWordPressAdminPage {
5 + public function __construct( $link = -1 ) {
6 + if (is_numeric($link) and -1 == $link) :
7 + $link = $this->submitted_link();
8 + endif;
6 9
7 - FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_categories_settings', /*capability=*/ 'manage_links');
10 + parent::__construct('feedwordpresscategories', $link);
11 + $this->dispatch = 'feedwordpress_admin_page_categories';
12 + $this->pagenames = array(
13 + 'default' => 'Categories & Tags',
14 + 'settings-update' => 'Syndicated Categories & Tags',
15 + 'open-sheet' => 'Categories & Tags',
16 + );
17 + $this->filename = __FILE__;
18 + }
8 19
9 - if (isset($GLOBALS['fwp_post']['save']) or isset($GLOBALS['fwp_post']['fix_mismatch'])) :
10 - $link_id = $_REQUEST['save_link_id'];
11 - elseif (isset($_REQUEST['link_id'])) :
12 - $link_id = $_REQUEST['link_id'];
13 - else :
14 - $link_id = NULL;
15 - endif;
20 + function unfamiliar_category_label ($name) {
21 + if (preg_match('/^create:(.*)$/', $name, $refs)) :
22 + $tax = get_taxonomy($refs[1]);
23 + $name = sprintf(__('Create new %s to match them'), $tax->labels->name);
24 + endif;
25 + return $name;
26 + }
16 27
17 - if (is_numeric($link_id) and $link_id) :
18 - $link =& new SyndicatedLink($link_id);
19 - else :
20 - $link = NULL;
21 - endif;
22 28
23 - $mesg = null;
29 + function feed_categories_box ($page, $box = NULL) {
30 + $link = $page->link;
24 31
25 - ////////////////////////////////////////////////
26 - // Process POST request, if any /////////////////
27 - ////////////////////////////////////////////////
28 - if (isset($GLOBALS['fwp_post']['save'])) :
29 - $saveCats = array();
30 - if (isset($GLOBALS['fwp_post']['post_category'])) :
31 - foreach ($GLOBALS['fwp_post']['post_category'] as $cat_id) :
32 - $saveCats[] = '{#'.$cat_id.'}';
33 - endforeach;
32 + $globalPostType = get_option('feedwordpress_syndicated_post_type', 'post');
33 + if ($this->for_feed_settings()) :
34 + $post_type = $link->setting('syndicated post type', 'syndicated_post_type', 'post');
35 + else :
36 + $post_type = $globalPostType;
34 37 endif;
38 + $taxonomies = get_object_taxonomies(array('object_type' => $post_type), 'names');
35 39
36 - if (is_object($link) and $link->found()) :
37 - $alter = array ();
40 + $unmatched = array('category' => array(), 'post_tag' => array());
41 + $matchUl = array('cats' => array(), 'tags' => array(), 'filter' => array());
42 + $tagLikeTaxonomies = array();
43 + foreach ($taxonomies as $tax) :
44 + $taxonomy = get_taxonomy($tax);
38 45
39 - // Categories
40 - if (!empty($saveCats)) : $link->settings['cats'] = $saveCats;
41 - else : unset($link->settings['cats']);
46 + if (!$taxonomy->hierarchical) :
47 + $tagLikeTaxonomies[] = $tax;
42 48 endif;
43 49
44 - // Tags
45 - if (isset($GLOBALS['fwp_post']['tags_input'])) :
46 - $link->settings['tags'] = array();
47 - foreach (explode(',', $GLOBALS['fwp_post']['tags_input']) as $tag) :
48 - $link->settings['tags'][] = trim($tag);
49 - endforeach;
50 - endif;
50 + $name = 'create:'.$tax;
51 + foreach (array('category', 'post_tag') as $what) :
52 + $unmatched[$what][$name] = array(
53 + 'label' => $this->unfamiliar_category_label($name),
54 + );
55 + $unmatchedRadio[$what][$name] = '';
56 + endforeach;
51 57
52 - // Unfamiliar categories
53 - if (isset($GLOBALS['fwp_post']["unfamiliar_category"])) :
54 - if ('site-default'==$GLOBALS['fwp_post']["unfamiliar_category"]) :
55 - unset($link->settings["unfamiliar category"]);
56 - else :
57 - $link->settings["unfamiliar category"] = $GLOBALS['fwp_post']["unfamiliar_category"];
58 - endif;
59 - endif;
58 + foreach (array('cats', 'tags', 'filter') as $what) :
59 + $matchUl[$what][$tax] = array(
60 + 'checked' => '',
61 + 'labels' => $taxonomy->labels,
62 + );
63 + endforeach;
64 + endforeach;
60 65
61 - // Category spitting regex
62 - if (isset($GLOBALS['fwp_post']['cat_split'])) :
63 - if (strlen(trim($GLOBALS['fwp_post']['cat_split'])) > 0) :
64 - $link->settings['cat_split'] = trim($GLOBALS['fwp_post']['cat_split']);
65 - else :
66 - unset($link->settings['cat_split']);
67 - endif;
68 - endif;
66 + foreach ($unmatched as $what => $um) :
67 + $unmatched[$what]['null'] = array('label' => __('Don\'t create any matching terms'));
68 + $unmatchedRadio[$what]['null'] = '';
69 + endforeach;
69 70
70 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
71 + $globalUnmatched = array(
72 + 'category' => FeedWordPress::on_unfamiliar('category'),
73 + 'post_tag' => FeedWordPress::on_unfamiliar('post_tag'),
74 + );
75 + foreach ($globalUnmatched as $what => $value) :
76 + if ($value=='create') : $value = 'create:category'; endif;
77 + if ($value=='tag') : $value = 'create:post_tag'; endif;
78 + $globalUnmatched[$what] = $value;
79 + endforeach;
71 80
72 - $alter_set = implode(", ", $alter);
81 + $globalMatch['cats'] = get_option('feedwordpress_match_cats', $taxonomies);
82 + $globalMatch['tags'] = get_option('feedwordpress_match_tags', $tagLikeTaxonomies);
83 + $globalMatch['filter'] = get_option('feedwordpress_match_filter', array());
73 84
74 - // issue update query
75 - $result = $wpdb->query("
76 - UPDATE $wpdb->links
77 - SET $alter_set
78 - WHERE link_id='$link_id'
79 - ");
80 - $updated_link = true;
85 + $globalMatchLabels = array();
86 + $nothingDoing = array('cats' => "won't try to match", 'tags' => "won't try to match", "filter" => "won't filter");
81 87
82 - // reload link information from DB
83 - if (function_exists('clean_bookmark_cache')) :
84 - clean_bookmark_cache($link_id);
85 - endif;
86 - $link =& new SyndicatedLink($link_id);
87 - else :
88 - // Categories
89 - if (!empty($saveCats)) :
90 - update_option('feedwordpress_syndication_cats', implode(FEEDWORDPRESS_CAT_SEPARATOR, $saveCats));
88 + foreach ($globalMatch as $what => $domain) :
89 + $labels = array(); $domain = array_filter($domain, 'remove_dummy_zero');
90 + foreach ($domain as $tax) :
91 + $tax = get_taxonomy($tax);
92 + $labels[] = $tax->labels->name;
93 + endforeach;
94 +
95 + if (count($labels) > 0) :
96 + $globalMatchLabels[$what] = implode(", ", $labels);
91 97 else :
92 - delete_option('feedwordpress_syndication_cats');
98 + $globalMatchLabels[$what] = $nothingDoing[$what];
93 99 endif;
94 -
95 - // Tags
96 - if (isset($_REQUEST['tags_input'])) :
97 - $tags = explode(",", $_REQUEST['tags_input']);
98 - else :
99 - $tags = array();
100 - endif;
101 -
102 - if (!empty($tags)) :
103 - update_option('feedwordpress_syndication_tags', implode(FEEDWORDPRESS_CAT_SEPARATOR, $tags));
104 - else :
105 - delete_option('feedwordpress_syndication_tags');
106 - endif;
100 + endforeach;
107 101
108 - update_option('feedwordpress_unfamiliar_category', $_REQUEST['unfamiliar_category']);
102 + if ($this->for_feed_settings()) :
103 + $href = $this->admin_page_href(basename(__FILE__));
109 104
110 - $updated_link = true;
111 - endif;
112 - else :
113 - $updated_link = false;
114 - endif;
105 + foreach ($unmatched as $what => $um) :
106 + // Is the global default setting appropriate to this post type?
107 + $GUC = $globalUnmatched[$what];
108 + if (isset($um[$GUC])) :
109 + // Yup. Let's add a site-default option
110 + $currently = $um[$GUC]['label'];
111 + $defaultLi = array(
112 + 'site-default' => array(
113 + 'label' => sprintf(
114 + __('Use the <a href="%s">site-wide setting</a> <span class="current-setting">Currently: <strong>%s</strong></span>'),
115 + $href,
116 + $currently
117 + ),
118 + ), );
119 + $unmatchedColumns[$what] = array(
120 + $defaultLi,
121 + );
122 + $unmatchedDefault[$what] = 'site-default';
123 + $unmatchedRadio[$what]['site-default'] = '';
124 + else :
125 + $opts = array_keys($unmatched[$what]);
126 + $unmatchedDefault[$what] = $opts[0];
127 + $unmatchedColumns[$what] = array();
128 + endif;
115 129
116 - ////////////////////////////////////////////////
117 - // Get defaults from database //////////////////
118 - ////////////////////////////////////////////////
119 -
120 - $unfamiliar = array ('create'=>'','tag' => '', 'default'=>'','filter'=>'');
121 - if (is_object($link) and $link->found()) :
122 - $unfamiliar['site-default'] = '';
123 - $ucKey = $link->settings["unfamiliar category"];
124 - $ucDefault = 'site-default';
130 + $ucKey[$what] = $link->setting("unfamiliar $what", NULL, NULL);
131 + endforeach;
125 132
126 - if (is_array($link->settings['cats'])) : $cats = $link->settings['cats'];
127 - else : $cats = array();
133 + $match['cats'] = $this->link->setting('match/cats', NULL, NULL);
134 + $match['tags'] = $this->link->setting('match/tags', NULL, NULL);
135 + $match['filter'] = $this->link->setting('match/filter', NULL, NULL);
136 + else :
137 + foreach ($unmatched as $what => $um) :
138 + $ucKey[$what] = FeedWordPress::on_unfamiliar($what);
139 + endforeach;
140 +
141 + $match = $globalMatch;
128 142 endif;
129 143
130 - $tags = $link->settings['tags'];
131 - else :
132 - $ucKey = FeedWordPress::on_unfamiliar('category');
133 - $ucDefault = 'create';
144 + foreach ($ucKey as $what => $uck) :
145 + if ($uck == 'tag') : $uck = 'create:post_tag'; endif;
146 + if ($uck == 'create') : $uck = 'create:category'; endif;
134 147
135 - $cats = array_map('trim',
136 - preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, get_option('feedwordpress_syndication_cats'))
137 - );
138 - $tags = array_map('trim',
139 - preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, get_option('feedwordpress_syndication_tags'))
140 - );
141 - endif;
148 + if (!is_string($uck)) :
149 + $uck = $unmatchedDefault[$what];
150 + endif;
151 + $ucKey[$what] = $uck;
142 152
143 - if (!is_string($ucKey) or !array_key_exists($ucKey, $unfamiliar)) :
144 - $ucKey = $ucDefault;
145 - endif;
146 - $unfamiliar[$ucKey] = ' checked="checked"';
153 + if (!array_key_exists($uck, $unmatchedRadio[$what])) :
154 + $obsoleteLi = array(
155 + $uck => array(
156 + 'label' => ' <span style="font-style: italic; color: #777;">'.$this->unfamiliar_category_label($uck).'</span> <span style="background-color: #ffff90; color: black;">(This setting is no longer applicable to the type of post syndicated from this feed!)</span><p>Please change this one of the following settings:</p>',
157 + ),
158 + );
159 + $unmatched[$what] = array_merge($obsoleteLi, $unmatched[$what]);
160 + $unmatchedRadio[$what][$uck] = ' disabled="disabled"';
161 + endif;
147 162
148 - $dogs = SyndicatedPost::category_ids($cats, /*unfamiliar=*/ NULL);
149 -?>
150 -<script type="text/javascript">
151 - function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
152 - if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
163 + $unmatchedRadio[$what][$uck] .= ' checked="checked"';
153 164
154 - var rollup=document.getElementById(item);
155 - var newuser=document.getElementById(appear);
156 - var sitewide=document.getElementById(disappear);
157 - if (rollup) {
158 - if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
159 - if (newuser) newuser.style.display=visibleStyle;
160 - if (sitewide) sitewide.style.display='none';
161 - } else {
162 - if (newuser) newuser.style.display='none';
163 - if (sitewide) sitewide.style.display=visibleStyle;
164 - }
165 - }
166 - }
167 -</script>
165 + $unmatchedColumns[$what][] = $unmatched[$what];
166 + endforeach;
168 167
169 -<?php if ($updated_link) : ?>
170 -<div class="updated"><p>Syndicated categories and tags settings updated.</p></div>
171 -<?php elseif (!is_null($mesg)) : ?>
172 -<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
173 -<?php endif; ?>
168 + $defaulted = array();
169 + foreach ($match as $what => $set) :
170 + $defaulted[$what] = false;
171 + if (is_null($set) or (count($set) < 1)) :
172 + $defaulted[$what] = true;
173 + if ($this->for_feed_settings()) :
174 + $set = $globalMatch[$what];
175 + $match[$what] = $globalMatch[$what];
176 + endif;
177 + endif;
174 178
175 -<div class="wrap">
176 -<form style="position: relative" action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
177 -<div><?php
178 - FeedWordPressCompatibility::stamp_nonce('feedwordpress_categories_settings');
179 + if (!$defaulted[$what] or $this->for_feed_settings()) :
180 + foreach ($set as $against) :
181 + if (array_key_exists($against, $matchUl[$what])) :
182 + $matchUl[$what][$against]['checked'] = ' checked="checked"';
183 + endif;
184 + endforeach;
185 + endif;
186 + endforeach;
179 187
180 - if (is_numeric($link_id) and $link_id) :
181 -?>
182 -<input type="hidden" name="save_link_id" value="<?php echo $link_id; ?>" />
183 -<?php
184 - else :
185 -?>
186 -<input type="hidden" name="save_link_id" value="*" />
187 -<?php
188 - endif;
189 -?>
190 -</div>
191 -
192 -<?php $links = FeedWordPress::syndicated_links(); ?>
193 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
194 - <div class="icon32"><img src="<?php print htmlspecialchars(WP_PLUGIN_URL.'/'.$GLOBALS['fwp_path'].'/feedwordpress.png'); ?>" alt="" /></div>
188 + // Hey ho, let's go...
189 + $offerSiteWideSettings = ($page->for_feed_settings() and ($post_type==$globalPostType));
190 + ?>
191 +<table class="edit-form narrow">
192 +<tr>
193 +<th scope="row">Match feed categories:</th>
194 +<td><input type="hidden" name="match_categories[cats][]" value="0" />
195 +<?php if ($offerSiteWideSettings) : ?>
196 + <table class="twofer">
197 + <tbody>
198 + <tr><td class="equals first <?php if ($defaulted['cats']) : ?>active<?php else: ?>inactive<?php endif; ?>"><p><label><input type="radio" name="match_default[cats]"
199 +value="yes" <?php if ($defaulted['cats']) : ?> checked="checked"<?php endif; ?> />
200 +Use the <a href="<?php print $href; ?>">site-wide setting</a>
201 +<span class="current-setting">Currently: <strong><?php print $globalMatchLabels['cats']; ?></strong></span></label></p></td>
202 + <td class="equals second <?php if ($defaulted['cats']) : ?>inactive<?php else: ?>active<?php endif; ?>"><p><label><input type="radio" name="match_default[cats]"
203 +value="no" <?php if (!$defaulted['cats']) : ?> checked="checked"<?php endif; ?> />
204 +Do something different with this feed.</label>
205 +<?php else : ?>
206 + <p>
195 207 <?php endif; ?>
196 -<h2>Categories &amp; Tags Settings<?php if (!is_null($link) and $link->found()) : ?>: <?php echo wp_specialchars($link->link->link_name, 1); ?><?php endif; ?></h2>
208 +When a feed provides categories for a post, try to match those categories
209 +locally with:</p>
210 +<ul class="options compact">
211 +<?php foreach ($matchUl['cats'] as $name => $li) : ?>
212 + <li><label><input type="checkbox"
213 + name="match_categories[cats][]" value="<?php print $name; ?>"
214 + <?php print $li['checked']; ?> /> <?php $l = $li['labels']; print $l->name; ?></label></li>
215 +<?php endforeach; ?>
216 +</ul>
217 +<?php if ($offerSiteWideSettings) : ?>
218 + </td></tr>
219 + </tbody>
220 + </table>
221 +<?php endif; ?>
222 +</td>
223 +</tr>
197 224
198 -<style type="text/css">
199 - table.edit-form th { width: 27%; vertical-align: top; }
200 - table.edit-form td { width: 73%; vertical-align: top; }
201 - table.edit-form td ul.options { margin: 0; padding: 0; list-style: none; }
202 -</style>
225 +<tr>
226 +<th scope="row">Unmatched categories:</th>
227 +<td><p>When <?php print $this->these_posts_phrase(); ?> have categories on
228 +the feed that don't have any local matches yet...</p>
203 229
204 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
205 - <style type="text/css">
206 - #post-search {
207 - float: right;
208 - margin:11px 12px 0;
209 - min-width: 130px;
210 - position:relative;
211 - }
212 - .fwpfs {
213 - color: #dddddd;
214 - background:#797979 url(<?php bloginfo('home') ?>/wp-admin/images/fav.png) repeat-x scroll left center;
215 - border-color:#777777 #777777 #666666 !important; -moz-border-radius-bottomleft:12px;
216 - -moz-border-radius-bottomright:12px;
217 - -moz-border-radius-topleft:12px;
218 - -moz-border-radius-topright:12px;
219 - border-style:solid;
220 - border-width:1px;
221 - line-height:15px;
222 - padding:3px 30px 4px 12px;
223 - }
224 - .fwpfs.slide-down {
225 - border-bottom-color: #626262;
226 - -moz-border-radius-bottomleft:0;
227 - -moz-border-radius-bottomright:0;
228 - -moz-border-radius-topleft:12px;
229 - -moz-border-radius-topright:12px;
230 - background-image:url(<?php bloginfo('home') ?>/wp-admin/images/fav-top.png);
231 - background-position:0 top;
232 - background-repeat:repeat-x;
233 - border-bottom-style:solid;
234 - border-bottom-width:1px;
235 - }
236 - </style>
237 -
238 - <script type="text/javascript">
239 - jQuery(document).ready(function($){
240 - $('.fwpfs').toggle(
241 - function(){$('.fwpfs').removeClass('slideUp').addClass('slideDown'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideDown') ) { $('.fwpfs').addClass('slide-down'); }}, 10) },
242 - function(){$('.fwpfs').removeClass('slideDown').addClass('slideUp'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideUp') ) { $('.fwpfs').removeClass('slide-down'); }}, 10) }
243 - );
244 - $('.fwpfs').bind(
245 - 'change',
246 - function () { this.form.submit(); }
247 - );
248 - $('#post-search .button').css( 'display', 'none' );
249 - });
250 - </script>
251 -<?php endif; /* else : */?>
252 -<p id="post-search">
253 -<select name="link_id" class="fwpfs" style="max-width: 20.0em;">
254 - <option value="*"<?php if (is_null($link) or !$link->found()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
255 -<?php if ($links) : foreach ($links as $ddlink) : ?>
256 - <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($link) and ($link->link->link_id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print wp_specialchars($ddlink->link_name, 1); ?></option>
257 -<?php endforeach; endif; ?>
258 -</select>
259 -<input class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" />
260 -</p>
261 -<?php /* endif; */ ?>
230 +<?php if (count($unmatchedColumns['category']) > 1) : ?>
231 + <table class="twofer">
232 +<?php else : ?>
233 + <table style="width: 100%">
234 +<?php endif; ?>
235 + <tbody>
236 + <tr>
237 + <?php foreach ($unmatchedColumns['category'] as $index => $column) : ?>
238 + <td class="equals <?php print (($index == 0) ? 'first' : 'second'); ?> inactive"><ul class="options">
239 + <?php foreach ($column as $name => $li) : ?>
240 + <li><label><input type="radio" name="unfamiliar_category" value="<?php print $name; ?>"<?php print $unmatchedRadio['category'][$name]; ?> /> <?php print $li['label']; ?></label></li>
241 + <?php endforeach; ?>
242 + </ul></td>
243 + <?php endforeach; ?>
244 + </tr>
245 + </tbody>
246 + </table>
247 +</td></tr>
262 248
263 -<?php if (!is_null($link) and $link->found()) : ?>
264 - <p>These settings only affect posts syndicated from
265 - <strong><?php echo wp_specialchars($link->link->link_name, 1); ?></strong>.</p>
249 +<tr>
250 +<th scope="row">Match inline tags:
251 +<p class="setting-description">Applies only to inline tags marked
252 +as links in the text of syndicated posts, using the
253 +<code>&lt;a rel="tag"&gt;...&lt;/a&gt;</code> microformat.
254 +Most feeds with "tags" just treat them as normal feed categories,
255 +like those handled above.</p>
256 +</th>
257 +<td><input type="hidden" name="match_categories[tags][]" value="0" />
258 +<?php if ($offerSiteWideSettings) : ?>
259 + <table class="twofer">
260 + <tbody>
261 + <tr><td class="equals first <?php if ($defaulted['tags']) : ?>active<?php else: ?>inactive<?php endif; ?>"><p><label><input type="radio" name="match_default[tags]"
262 +value="yes" <?php if ($defaulted['tags']) : ?> checked="checked"<?php endif; ?> />
263 +Use the <a href="<?php print $href; ?>">site-wide setting</a>
264 +<span class="current-setting">Currently: <strong><?php print $globalMatchLabels['tags']; ?></strong></span></label></p>
265 +</td>
266 + <td class="equals second <?php if ($defaulted['tags']) : ?>inactive<?php else: ?>active<?php endif; ?>"><p><label><input type="radio" name="match_default[tags]"
267 +value="no" <?php if (!$defaulted['tags']) : ?> checked="checked"<?php endif; ?> />
268 +Do something different with this feed.</label>
266 269 <?php else : ?>
267 - <p>These settings affect posts syndicated from any feed unless they are overridden
268 - by settings for that specific feed.</p>
270 + <p>
269 271 <?php endif; ?>
272 +When a feed provides tags inline in a post, try to match those tags
273 +locally with:</p>
274 +<ul class="options compact">
275 +<?php foreach ($matchUl['tags'] as $name => $li) : ?>
276 + <li><label><input type="checkbox"
277 + name="match_categories[tags][]" value="<?php print $name; ?>"
278 + <?php print $li['checked']; ?> /> <?php $l = $li['labels']; print $l->name; ?></label></li>
279 +<?php endforeach; ?>
280 +</ul>
281 +<?php if ($offerSiteWideSettings) : ?>
282 + </td></tr>
283 + </tbody>
284 + </table>
285 +<?php endif; ?>
286 +</td>
287 +</tr>
270 288
271 -<div id="poststuff">
272 -<div id="post-body">
273 -<?php
274 - fwp_option_box_opener(__('Categories'), 'categorydiv', 'postbox');
275 - fwp_category_box($dogs, 'all syndicated posts'.((is_object($link) and $link->found()) ? ' from this feed':''));
276 -?>
277 -<table class="edit-form">
278 289 <tr>
279 -<th scope="row">Unfamiliar categories:</th>
280 -<td><p>When one of the categories on a syndicated post is a category that FeedWordPress has not encountered before ...</p>
290 +<th scope="row">Unmatched inline tags:</th>
291 +<td><p>When the text of <?php print $this->these_posts_phrase(); ?> contains
292 +inline tags that don't have any local matches yet...</p>
281 293
282 -<ul class="options">
283 -<?php if (is_object($link) and ($link->found())) : ?>
284 -<li><label><input type="radio" name="unfamiliar_category" value="site-default"<?php echo $unfamiliar['site-default']; ?> /> use the <a href="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php print basename(__FILE__); ?>">site-wide setting</a>
285 -(currently <strong><?php echo FeedWordPress::on_unfamiliar('category'); ?></strong>)</label></li>
294 +<?php if (count($unmatchedColumns['post_tag']) > 1) : ?>
295 + <table class="twofer">
296 +<?php else : ?>
297 + <table style="width: 100%">
298 +<?php endif; ?>
299 + <tbody>
300 + <tr>
301 + <?php foreach ($unmatchedColumns['post_tag'] as $index => $column) : ?>
302 + <td class="equals <?php print (($index == 0) ? 'first' : 'second'); ?> inactive"><ul class="options">
303 + <?php foreach ($column as $name => $li) : ?>
304 + <li><label><input type="radio" name="unfamiliar_post_tag" value="<?php print $name; ?>"<?php print $unmatchedRadio['post_tag'][$name]; ?> /> <?php print $li['label']; ?></label></li>
305 + <?php endforeach; ?>
306 + </ul></td>
307 + <?php endforeach; ?>
308 + </tr>
309 + </tbody>
310 + </table>
311 +
312 +</td></tr>
313 +
314 +<tr>
315 +<th scope="row">Filter:</th>
316 +<td><input type="hidden" name="match_categories[filter][]" value="0" />
317 +<?php if ($offerSiteWideSettings) : ?>
318 + <table class="twofer">
319 + <tbody>
320 + <tr>
321 + <td class="equals first <?php if ($defaulted['filter']) : ?>active<?php else: ?>inactive<?php endif; ?>">
322 + <p><label><input type="radio" name="match_default[filter]"
323 +value="yes" <?php if ($defaulted['filter']) : ?> checked="checked"<?php endif; ?> />
324 +Use the <a href="<?php print $href; ?>">site-wide setting</a>
325 +<span class="current-setting">Currently: <strong><?php print $globalMatchLabels['filter']; ?></strong></span></label></p>
326 + </td>
327 + <td class="equals second <?php if ($defaulted['filter']) : ?>inactive<?php else: ?>active<?php endif; ?>">
328 + <p><label><input type="radio" name="match_default[filter]"
329 +value="no" <?php if (!$defaulted['filter']) : ?> checked="checked"<?php endif; ?> />
330 +Do something different with this feed:</label></p>
331 +<div style="margin-left: 3.0em;">
286 332 <?php endif; ?>
287 333
288 -<li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar['create']; ?> /> create a new category</label></li>
334 +<ul class="options">
335 +<?php foreach ($matchUl['filter'] as $tax => $li) : ?>
336 +<li><label><input type="checkbox" name="match_categories[filter][]" value="<?php print $tax; ?>"
337 +<?php print $li['checked']; ?> /> Don't syndicate posts unless they match at
338 +least one local <strong><?php $l = $li['labels']; print $l->singular_name; ?></strong></label></li>
339 +<?php endforeach; ?>
340 +</ul>
289 341
290 -<?php if (fwp_test_wp_version(FWP_SCHEMA_23)) : ?>
291 -<li><label><input type="radio" name="unfamiliar_category" value="tag"<?php echo $unfamiliar['tag']; ?>/> create a new tag</label></li>
342 +<?php if ($offerSiteWideSettings) : ?>
343 + </div>
344 + </td></tr>
345 + </tbody>
346 + </table>
292 347 <?php endif; ?>
293 -
294 -<li><label><input type="radio" name="unfamiliar_category" value="default"<?php echo $unfamiliar['default']; ?> /> don't create new categories<?php if (fwp_test_wp_version(FWP_SCHEMA_23)) : ?> or tags<?php endif; ?></label></li>
295 -<li><label><input type="radio" name="unfamiliar_category" value="filter"<?php echo $unfamiliar['filter']; ?> /> don't create new categories<?php if (fwp_test_wp_version(FWP_SCHEMA_23)) : ?> or tags<?php endif; ?> and don't syndicate posts unless they match at least one familiar category</label></li>
296 -</ul></td>
348 +</td>
297 349 </tr>
298 -
299 -<?php if (is_object($link) and $link->found()) : ?>
350 +<?php if ($page->for_feed_settings()) : ?>
300 351 <tr>
301 352 <th scope="row">Multiple categories:</th>
302 -<td>
353 +<td>
303 354 <input type="text" size="20" id="cat_split" name="cat_split" value="<?php if (isset($link->settings['cat_split'])) : echo htmlspecialchars($link->settings['cat_split']); endif; ?>" />
304 355 <p class="setting-description">Enter a <a href="http://us.php.net/manual/en/reference.pcre.pattern.syntax.php">Perl-compatible regular expression</a> here if the feed provides multiple
305 356 categories in a single category element. The regular expression should match
306 357 the characters used to separate one category from the next. If the feed uses
@@ -309,38 +360,256 @@
309 360 blank.</p></td>
310 361 </tr>
311 362 <?php endif; ?>
312 363 </table>
313 -<?php
314 - fwp_option_box_closer();
315 - fwp_linkedit_periodic_submit();
316 -
317 -if (isset($wp_db_version) and $wp_db_version >= FWP_SCHEMA_25) :
318 - fwp_tags_box($tags);
319 - fwp_linkedit_periodic_submit();
320 -endif; ?>
321 -</div>
322 -</div>
364 + <?php
365 + } /* FeedWordPressCategoriesPage::feed_categories_box() */
323 366
324 -<p class="submit">
325 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
326 -</p>
367 + function term_option_map () {
368 + return array(
369 + 'category' => 'feedwordpress_syndication_cats',
370 + 'post_tag' => 'feedwordpress_syndication_tags',
371 + );
372 + }
373 + function term_setting_map () {
374 + return array(
375 + 'category' => 'cats',
376 + 'post_tag' => 'tags',
377 + );
378 + }
327 379
328 -<script type="text/javascript">
329 - contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');
330 -<?php if (is_object($link) and $link->found()) : ?>
331 -<?php for ($j=1; $j<=$i; $j++) : ?>
332 - contextual_appearance('author-rules-<?php echo $j; ?>', 'author-rules-<?php echo $j; ?>-newuser', 'author-rules-<?php echo $j; ?>-default', 'newuser', 'inline');
333 -<?php endfor; ?>
334 - contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
335 - contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
336 -<?php else : ?>
337 - contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
338 -<?php endif; ?>
339 -</script>
340 -</form>
341 -</div> <!-- class="wrap" -->
342 -<?php
343 -} /* function fwp_categories_page () */
380 + function categories_box ($page, $box = NULL) {
381 + $link = $page->link;
382 + $dummy = null;
383 + $syndicatedlink = new SyndicatedLink($dummy);
344 384
345 - fwp_categories_page();
385 + if ($this->for_feed_settings()) :
386 + $post_type = $link->setting('syndicated post type', 'syndicated_post_type', 'post');
387 + else :
388 + $post_type = get_option('feedwordpress_syndicated_post_type', 'post');
389 + endif;
390 + $taxonomies = get_object_taxonomies(array('object_type' => $post_type), 'names');
391 +
392 + $option_map = $this->term_option_map();
393 + $setting_map = $this->term_setting_map();
394 + $globalTax = get_option('feedwordpress_syndication_terms', array());
395 + if ($page->for_feed_settings()) :
396 + $terms = $link->setting('terms', NULL, array());
397 + endif;
398 +
399 + ?>
400 + <table class="edit-form narrow">
401 + <tbody>
402 + <?php
403 + foreach ($taxonomies as $tax) :
404 + $taxonomy = get_taxonomy($tax);
405 + ?>
406 + <tr><th><?php print $taxonomy->labels->name; ?></th>
407 + <td><?php
408 + if (isset($option_map[$tax])) :
409 + $option = $option_map[$tax];
410 + $globalCats = preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, get_option($option));
411 + elseif (isset($globalTax[$tax])) :
412 + $globalCats = $globalTax[$tax];
413 + else :
414 + $globalCats = array();
415 + endif;
416 + $globalCats = array_map('trim', $globalCats);
417 +
418 + if ($page->for_feed_settings()) :
419 + $add_global_categories = $link->setting("add/$tax", NULL, 'yes');
420 + $checked = array('yes' => '', 'no' => '');
421 + $checked[$add_global_categories] = ' checked="checked"';
422 +
423 + if (isset($setting_map[$tax])) :
424 + $setting = $setting_map[$tax];
425 + $cats = $link->setting($setting, NULL, NULL);
426 + if (is_null($cats)) : $cats = array(); endif;
427 + elseif (isset($terms[$tax])) :
428 + $cats = $terms[$tax];
429 + else :
430 + $cats = array();
431 + endif;
432 + else :
433 + $cats = $globalCats;
434 + endif;
435 +
436 + if ($page->for_feed_settings()) :
437 + ?>
438 + <table class="twofer">
439 + <tbody>
440 + <tr>
441 + <td class="primary">
442 + <?php
443 + endif;
444 +
445 + $dogs = $syndicatedlink->category_ids(/*post=*/ NULL, $cats, /*unfamiliar=*/ NULL, /*taxonomies=*/ array($tax));
446 +
447 + if ($taxonomy->hierarchical) : // Use a category-style checkbox
448 + fwp_category_box($dogs, 'all '.$page->these_posts_phrase(), /*tags=*/ array(), /*params=*/ array('taxonomy' => $tax));
449 + else : // Use a tag-style edit box
450 + fwp_tags_box($cats, 'all '.$page->these_posts_phrase(), /*params=*/ array('taxonomy' => $tax));
451 + endif;
452 +
453 + $globalDogs = $syndicatedlink->category_ids(/*post=*/ NULL, $globalCats, /*unfamiliar=*/ 'create:'.$tax, /*taxonomies=*/ array($tax));
454 +
455 + $siteWideHref = $this->admin_page_href(basename(__FILE__));
456 +
457 + if ($page->for_feed_settings()) :
458 + ?>
459 + </td>
460 + <td class="secondary">
461 + <h4>Site-wide <?php print $taxonomy->labels->name; ?></h4>
462 + <?php if (count($globalCats) > 0) : ?>
463 + <ul class="current-setting">
464 + <?php foreach ($globalDogs as $dog) : ?>
465 + <li><?php $cat = get_term($dog, $tax); print $cat->name; ?></li>
466 + <?php endforeach; ?>
467 + </ul>
468 + </div>
469 + <p>
470 + <?php else : ?>
471 + <p>Site-wide settings may also assign categories to syndicated
472 + posts.
473 + <?php endif; ?>
474 + Should <?php print $page->these_posts_phrase(); ?> be assigned
475 + these <?php print $taxonomy->labels->name; ?> from the <a href="<?php print esc_html($siteWideHref); ?>">site-wide settings</a>, in
476 + addition to the feed-specific <?php print $taxonomy->labels->name; ?> you set up here?</p>
477 +
478 + <ul class="settings">
479 + <li><p><label><input type="radio" name="add_global[<?php print $tax; ?>]" value="yes" <?php print $checked['yes']; ?> /> Yes. Place <?php print $page->these_posts_phrase(); ?> under all these categories.</label></p></li>
480 + <li><p><label><input type="radio" name="add_global[<?php print $tax; ?>]" value="no" <?php print $checked['no']; ?> /> No. Only use the categories I set up on the left. Do not use the global defaults for <?php print $page->these_posts_phrase(); ?></label></p></li>
481 + </ul>
482 + </td>
483 + </tr>
484 + </tbody>
485 + </table>
486 + <?php
487 + endif;
488 + ?>
489 + </td>
490 + </tr>
491 + <?php
492 + endforeach;
493 + ?>
494 + </tbody>
495 + </table>
496 + <?php
497 + } /* FeedWordPressCategoriesPage::categories_box () */
498 +
499 + function save_settings ($post) {
500 + if (isset($post['match_categories'])) :
501 + foreach ($post['match_categories'] as $what => $set) :
502 + // Defaulting is controlled by a separate radio button
503 + if ($this->for_feed_settings()
504 + and isset($post['match_default'])
505 + and isset($post['match_default'][$what])
506 + and $post['match_default'][$what]=='yes') :
507 + $set = NULL; // Defaulted!
508 + endif;
509 +
510 + $this->update_setting("match/$what", $set, NULL);
511 + endforeach;
512 + endif;
513 + $optionMap = $this->term_option_map();
514 + $settingMap = $this->term_setting_map();
515 +
516 + $saveTerms = array(); $separateSaveTerms = array('category' => array(), 'post_tag' => array());
517 +
518 + if (!isset($post['tax_input'])) : $post['tax_input'] = array(); endif;
519 +
520 + // Merge in data from older-notation category check boxes
521 + if (isset($post['post_category'])) :
522 + // Just merging in for processing below.
523 + $post['tax_input']['category'] = array_merge(
524 + (isset($post['tax_input']['category']) ? $post['tax_input']['category'] : array()),
525 + $post['post_category']
526 + );
527 + endif;
528 +
529 + // Process data from term tag boxes and check boxes
530 + foreach ($post['tax_input'] as $tax => $terms) :
531 + $saveTerms[$tax] = array();
532 + if (is_array($terms)) : // Numeric IDs from checklist
533 + foreach ($terms as $term) :
534 + if ($term) :
535 + $saveTerms[$tax][] = '{'.$tax.'#'.$term.'}';
536 + endif;
537 + endforeach;
538 + else : // String from tag input
539 + $saveTerms[$tax] = explode(",", $terms);
540 + endif;
541 + $saveTerms[$tax] = array_map('trim', $saveTerms[$tax]);
542 +
543 + if (isset($optionMap[$tax])) :
544 + $separateSaveTerms[$tax] = $saveTerms[$tax];
545 + unset($saveTerms[$tax]);
546 + endif;
547 + endforeach;
548 +
549 + if (isset($post['post_category'])) :
550 + foreach ($post['post_category'] as $cat) :
551 + $separateSaveTerms['category'][] = '{category#'.$cat.'}';
552 + endforeach;
553 + endif;
554 +
555 + // Unmatched categories and tags
556 + foreach (array('category', 'post_tag') as $what) :
557 + if (isset($post["unfamiliar_{$what}"])) :
558 + $this->update_setting(
559 + "unfamiliar {$what}",
560 + $post["unfamiliar_{$what}"],
561 + 'site-default'
562 + );
563 + endif;
564 + endforeach;
565 +
566 + // Categories and Tags
567 + foreach ($separateSaveTerms as $tax => $terms) :
568 + if ($this->for_feed_settings()) :
569 + $this->link->update_setting($settingMap[$tax], $terms, array());
570 + else :
571 + if (!empty($terms)) :
572 + update_option($optionMap[$tax], implode(FEEDWORDPRESS_CAT_SEPARATOR, $terms));
573 + else :
574 + delete_option($optionMap[$tax]);
575 + endif;
576 + endif;
577 + endforeach;
578 +
579 + // Other terms
580 + $this->update_setting(array('feed'=>'terms', 'global'=>'syndication_terms'), $saveTerms, array());
581 +
582 + if ($this->for_feed_settings()) :
583 + // Category splitting regex
584 + if (isset($post['cat_split'])) :
585 + $this->link->update_setting('cat_split', trim($post['cat_split']), '');
586 + endif;
587 +
588 + // Treat global terms (cats, tags, etc.) as additional,
589 + // or as defaults to be overridden and replaced?
590 + if (isset($post['add_global'])) :
591 + foreach ($post['add_global'] as $what => $value) :
592 + $this->link->update_setting("add/$what", $value);
593 + endforeach;
594 + endif;
595 + endif;
596 + parent::save_settings($post);
597 + } /* FeedWordPressCategoriesPage::save_settings() */
598 +
599 + function display () {
600 + ////////////////////////////////////////////////
601 + // Display settings boxes //////////////////////
602 + ////////////////////////////////////////////////
603 +
604 + $this->boxes_by_methods = array(
605 + 'feed_categories_box' => __('Feed Categories & Tags'),
606 + 'categories_box' => array('title' => __('Categories'), 'id' => 'categorydiv'),
607 + );
608 +
609 + parent::display();
610 + }
611 +}
612 +
613 + $categoriesPage = new FeedWordPressCategoriesPage;
614 + $categoriesPage->display();
346 615