PluginProbe
FeedWordPress / 2016.1213
FeedWordPress v2016.1213
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 -287 2009.07072016.1213 View file →
@@ -1,303 +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 - // Different variable names to cope with different WordPress AJAX UIs
37 - $syndicatedTags = array();
38 - if (isset($GLOBALS['fwp_post']['tax_input']['post_tag'])) :
39 - $syndicatedTags = explode(",", $GLOBALS['fwp_post']['tax_input']['post_tag']);
40 - elseif (isset($GLOBALS['fwp_post']['tags_input'])) :
41 - $syndicatedTags = explode(",", $GLOBALS['fwp_post']['tags_input']);
42 - endif;
43 - $syndicatedTags = array_map('trim', $syndicatedTags);
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);
44 45
45 - if (is_object($link) and $link->found()) :
46 - $alter = array ();
46 + if (!$taxonomy->hierarchical) :
47 + $tagLikeTaxonomies[] = $tax;
48 + endif;
47 49
48 - // Categories
49 - if (!empty($saveCats)) : $link->settings['cats'] = $saveCats;
50 - else : unset($link->settings['cats']);
51 - 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;
52 57
53 - // Tags
54 - $link->settings['tags'] = $syndicatedTags;
58 + foreach (array('cats', 'tags', 'filter') as $what) :
59 + $matchUl[$what][$tax] = array(
60 + 'checked' => '',
61 + 'labels' => $taxonomy->labels,
62 + );
63 + endforeach;
64 + endforeach;
55 65
56 - // Unfamiliar categories
57 - if (isset($GLOBALS['fwp_post']["unfamiliar_category"])) :
58 - if ('site-default'==$GLOBALS['fwp_post']["unfamiliar_category"]) :
59 - unset($link->settings["unfamiliar category"]);
60 - else :
61 - $link->settings["unfamiliar category"] = $GLOBALS['fwp_post']["unfamiliar_category"];
62 - endif;
63 - 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;
64 70
65 - // Category spitting regex
66 - if (isset($GLOBALS['fwp_post']['cat_split'])) :
67 - if (strlen(trim($GLOBALS['fwp_post']['cat_split'])) > 0) :
68 - $link->settings['cat_split'] = trim($GLOBALS['fwp_post']['cat_split']);
69 - else :
70 - unset($link->settings['cat_split']);
71 - endif;
72 - endif;
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;
73 80
74 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
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());
75 84
76 - $alter_set = implode(", ", $alter);
85 + $globalMatchLabels = array();
86 + $nothingDoing = array('cats' => "won't try to match", 'tags' => "won't try to match", "filter" => "won't filter");
77 87
78 - // issue update query
79 - $result = $wpdb->query("
80 - UPDATE $wpdb->links
81 - SET $alter_set
82 - WHERE link_id='$link_id'
83 - ");
84 - $updated_link = true;
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;
85 94
86 - // reload link information from DB
87 - if (function_exists('clean_bookmark_cache')) :
88 - clean_bookmark_cache($link_id);
89 - endif;
90 - $link =& new SyndicatedLink($link_id);
91 - else :
92 - // Categories
93 - if (!empty($saveCats)) :
94 - update_option('feedwordpress_syndication_cats', implode(FEEDWORDPRESS_CAT_SEPARATOR, $saveCats));
95 + if (count($labels) > 0) :
96 + $globalMatchLabels[$what] = implode(", ", $labels);
95 97 else :
96 - delete_option('feedwordpress_syndication_cats');
98 + $globalMatchLabels[$what] = $nothingDoing[$what];
97 99 endif;
98 -
99 - // Tags
100 - if (!empty($syndicatedTags)) :
101 - update_option('feedwordpress_syndication_tags', implode(FEEDWORDPRESS_CAT_SEPARATOR, $syndicatedTags));
102 - else :
103 - delete_option('feedwordpress_syndication_tags');
104 - endif;
100 + endforeach;
105 101
106 - update_option('feedwordpress_unfamiliar_category', $_REQUEST['unfamiliar_category']);
102 + if ($this->for_feed_settings()) :
103 + $href = $this->admin_page_href(basename(__FILE__));
107 104
108 - $updated_link = true;
109 - endif;
110 - else :
111 - $updated_link = false;
112 - 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;
113 129
114 - ////////////////////////////////////////////////
115 - // Get defaults from database //////////////////
116 - ////////////////////////////////////////////////
117 -
118 - $unfamiliar = array ('create'=>'','tag' => '', 'default'=>'','filter'=>'');
119 - if (is_object($link) and $link->found()) :
120 - $unfamiliar['site-default'] = '';
121 - $ucKey = $link->settings["unfamiliar category"];
122 - $ucDefault = 'site-default';
130 + $ucKey[$what] = $link->setting("unfamiliar $what", NULL, NULL);
131 + endforeach;
123 132
124 - if (is_array($link->settings['cats'])) : $cats = $link->settings['cats'];
125 - 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;
126 142 endif;
127 143
128 - $tags = $link->settings['tags'];
129 - else :
130 - $ucKey = FeedWordPress::on_unfamiliar('category');
131 - $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;
132 147
133 - $cats = array_map('trim',
134 - preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, get_option('feedwordpress_syndication_cats'))
135 - );
136 - $tags = array_map('trim',
137 - preg_split(FEEDWORDPRESS_CAT_SEPARATOR_PATTERN, get_option('feedwordpress_syndication_tags'))
138 - );
139 - endif;
148 + if (!is_string($uck)) :
149 + $uck = $unmatchedDefault[$what];
150 + endif;
151 + $ucKey[$what] = $uck;
140 152
141 - if (!is_string($ucKey) or !array_key_exists($ucKey, $unfamiliar)) :
142 - $ucKey = $ucDefault;
143 - endif;
144 - $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;
145 162
146 - $dogs = SyndicatedPost::category_ids($cats, /*unfamiliar=*/ NULL);
147 -?>
148 -<script type="text/javascript">
149 - function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
150 - if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
163 + $unmatchedRadio[$what][$uck] .= ' checked="checked"';
151 164
152 - var rollup=document.getElementById(item);
153 - var newuser=document.getElementById(appear);
154 - var sitewide=document.getElementById(disappear);
155 - if (rollup) {
156 - if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
157 - if (newuser) newuser.style.display=visibleStyle;
158 - if (sitewide) sitewide.style.display='none';
159 - } else {
160 - if (newuser) newuser.style.display='none';
161 - if (sitewide) sitewide.style.display=visibleStyle;
162 - }
163 - }
164 - }
165 -</script>
165 + $unmatchedColumns[$what][] = $unmatched[$what];
166 + endforeach;
166 167
167 -<?php if ($updated_link) : ?>
168 -<div class="updated"><p>Syndicated categories and tags settings updated.</p></div>
169 -<?php elseif (!is_null($mesg)) : ?>
170 -<div class="updated"><p><?php print wp_specialchars($mesg, 1); ?></p></div>
171 -<?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;
172 178
173 -<div class="wrap">
174 -<form style="position: relative" action="admin.php?page=<?php print $GLOBALS['fwp_path'] ?>/<?php echo basename(__FILE__); ?>" method="post">
175 -<div><?php
176 - 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;
177 187
178 - if (is_numeric($link_id) and $link_id) :
179 -?>
180 -<input type="hidden" name="save_link_id" value="<?php echo $link_id; ?>" />
181 -<?php
182 - else :
183 -?>
184 -<input type="hidden" name="save_link_id" value="*" />
185 -<?php
186 - endif;
187 -?>
188 -</div>
189 -
190 -<?php $links = FeedWordPress::syndicated_links(); ?>
191 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
192 - <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>
193 207 <?php endif; ?>
194 -<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>
195 224
196 -<style type="text/css">
197 - table.edit-form th { width: 27%; vertical-align: top; }
198 - table.edit-form td { width: 73%; vertical-align: top; }
199 - table.edit-form td ul.options { margin: 0; padding: 0; list-style: none; }
200 -</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>
201 229
202 -<?php if (fwp_test_wp_version(FWP_SCHEMA_27)) : ?>
203 - <style type="text/css">
204 - #post-search {
205 - float: right;
206 - margin:11px 12px 0;
207 - min-width: 130px;
208 - position:relative;
209 - }
210 - .fwpfs {
211 - color: #dddddd;
212 - background:#797979 url(<?php bloginfo('home') ?>/wp-admin/images/fav.png) repeat-x scroll left center;
213 - border-color:#777777 #777777 #666666 !important; -moz-border-radius-bottomleft:12px;
214 - -moz-border-radius-bottomright:12px;
215 - -moz-border-radius-topleft:12px;
216 - -moz-border-radius-topright:12px;
217 - border-style:solid;
218 - border-width:1px;
219 - line-height:15px;
220 - padding:3px 30px 4px 12px;
221 - }
222 - .fwpfs.slide-down {
223 - border-bottom-color: #626262;
224 - -moz-border-radius-bottomleft:0;
225 - -moz-border-radius-bottomright:0;
226 - -moz-border-radius-topleft:12px;
227 - -moz-border-radius-topright:12px;
228 - background-image:url(<?php bloginfo('home') ?>/wp-admin/images/fav-top.png);
229 - background-position:0 top;
230 - background-repeat:repeat-x;
231 - border-bottom-style:solid;
232 - border-bottom-width:1px;
233 - }
234 - </style>
235 -
236 - <script type="text/javascript">
237 - jQuery(document).ready(function($){
238 - $('.fwpfs').toggle(
239 - function(){$('.fwpfs').removeClass('slideUp').addClass('slideDown'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideDown') ) { $('.fwpfs').addClass('slide-down'); }}, 10) },
240 - function(){$('.fwpfs').removeClass('slideDown').addClass('slideUp'); setTimeout(function(){if ( $('.fwpfs').hasClass('slideUp') ) { $('.fwpfs').removeClass('slide-down'); }}, 10) }
241 - );
242 - $('.fwpfs').bind(
243 - 'change',
244 - function () { this.form.submit(); }
245 - );
246 - $('#post-search .button').css( 'display', 'none' );
247 - });
248 - </script>
249 -<?php endif; /* else : */?>
250 -<p id="post-search">
251 -<select name="link_id" class="fwpfs" style="max-width: 20.0em;">
252 - <option value="*"<?php if (is_null($link) or !$link->found()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
253 -<?php if ($links) : foreach ($links as $ddlink) : ?>
254 - <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>
255 -<?php endforeach; endif; ?>
256 -</select>
257 -<input class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" />
258 -</p>
259 -<?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>
260 248
261 -<?php if (!is_null($link) and $link->found()) : ?>
262 - <p>These settings only affect posts syndicated from
263 - <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>
264 269 <?php else : ?>
265 - <p>These settings affect posts syndicated from any feed unless they are overridden
266 - by settings for that specific feed.</p>
270 + <p>
267 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>
268 288
269 -<div id="poststuff">
270 -<div id="post-body">
271 -<?php
272 - fwp_option_box_opener("Feed Categories & Tags", 'fromfeeddiv', 'postbox');
273 -?>
274 -<table class="edit-form">
275 289 <tr>
276 -<th scope="row">Unfamiliar categories:</th>
277 -<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>
278 293
279 -<ul class="options">
280 -<?php if (is_object($link) and ($link->found())) : ?>
281 -<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>
282 -(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;">
283 332 <?php endif; ?>
284 333
285 -<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>
286 341
287 -<?php if (fwp_test_wp_version(FWP_SCHEMA_23)) : ?>
288 -<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>
289 347 <?php endif; ?>
290 -
291 -<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>
292 -<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>
293 -</ul></td>
348 +</td>
294 349 </tr>
295 -
296 -<?php if (is_object($link) and $link->found()) : ?>
350 +<?php if ($page->for_feed_settings()) : ?>
297 351 <tr>
298 352 <th scope="row">Multiple categories:</th>
299 -<td>
353 +<td>
300 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; ?>" />
301 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
302 356 categories in a single category element. The regular expression should match
303 357 the characters used to separate one category from the next. If the feed uses
@@ -306,46 +360,256 @@
306 360 blank.</p></td>
307 361 </tr>
308 362 <?php endif; ?>
309 363 </table>
310 -<?php
311 - fwp_option_box_closer();
312 - fwp_linkedit_periodic_submit();
313 -?>
314 -<?php
315 - fwp_option_box_opener(__('Categories'), 'categorydiv', 'postbox');
316 - fwp_category_box($dogs, 'all syndicated posts'.((is_object($link) and $link->found()) ? ' from this feed':''));
317 -?>
318 -<?php
319 - fwp_option_box_closer();
320 - fwp_linkedit_periodic_submit();
321 -
322 -if (fwp_test_wp_version(FWP_SCHEMA_25)) :
323 - fwp_tags_box($tags, 'all syndicated posts'.((is_object($link) and $link->found()) ? ' from this feed':''));
324 - fwp_linkedit_periodic_submit();
325 -endif; ?>
326 -</div>
327 -</div>
364 + <?php
365 + } /* FeedWordPressCategoriesPage::feed_categories_box() */
328 366
329 -<p class="submit">
330 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
331 -</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 + }
332 379
333 -<script type="text/javascript">
334 - contextual_appearance('unfamiliar-author', 'unfamiliar-author-newuser', 'unfamiliar-author-default', 'newuser', 'inline');
335 -<?php if (is_object($link) and $link->found()) : ?>
336 -<?php for ($j=1; $j<=$i; $j++) : ?>
337 - contextual_appearance('author-rules-<?php echo $j; ?>', 'author-rules-<?php echo $j; ?>-newuser', 'author-rules-<?php echo $j; ?>-default', 'newuser', 'inline');
338 -<?php endfor; ?>
339 - contextual_appearance('add-author-rule', 'add-author-rule-newuser', 'add-author-rule-default', 'newuser', 'inline');
340 - contextual_appearance('fix-mismatch-to', 'fix-mismatch-to-newuser', null, 'newuser', 'inline');
341 -<?php else : ?>
342 - contextual_appearance('match-author-by-email', 'unless-null-email', null, 'yes', 'block', /*checkbox=*/ true);
343 -<?php endif; ?>
344 -</script>
345 -</form>
346 -</div> <!-- class="wrap" -->
347 -<?php
348 -} /* function fwp_categories_page () */
380 + function categories_box ($page, $box = NULL) {
381 + $link = $page->link;
382 + $dummy = null;
383 + $syndicatedlink = new SyndicatedLink($dummy);
349 384
350 - 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();
351 615