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