PluginProbe
FeedWordPress / 2025.1211
FeedWordPress v2025.1211
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 +560 -288 2009.07072025.1211 View file →
@@ -1,304 +1,368 @@
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 -
23 - $mesg = null;
24 -
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;
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'] );
34 38 endif;
39 + }
40 +
41 + function feed_categories_box ($page, $box = NULL) {
42 + $link = $page->link;
35 43
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']);
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');
47 + else :
48 + $post_type = $globalPostType;
42 49 endif;
43 - $syndicatedTags = array_map('trim', $syndicatedTags);
50 + $taxonomies = get_object_taxonomies(array('object_type' => $post_type), 'names');
44 51
45 - if (is_object($link) and $link->found()) :
46 - $alter = array ();
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);
47 57
48 - // Categories
49 - if (!empty($saveCats)) : $link->settings['cats'] = $saveCats;
50 - else : unset($link->settings['cats']);
58 + if ( ! $taxonomy->hierarchical) :
59 + $tagLikeTaxonomies[] = $tax;
51 60 endif;
52 61
53 - // Tags
54 - $link->settings['tags'] = $syndicatedTags;
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;
55 69
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;
70 + foreach (array('cats', 'tags', 'filter') as $what) :
71 + $matchUl[$what][$tax] = array(
72 + 'checked' => '',
73 + 'labels' => $taxonomy->labels,
74 + );
75 + endforeach;
76 + endforeach;
64 77
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;
78 + foreach ($unmatched as $what => $um) :
79 + $unmatched[$what]['null'] = array('label' => __('Don\'t create any matching terms'));
80 + $unmatchedRadio[$what]['null'] = '';
81 + endforeach;
73 82
74 - $alter[] = "link_notes = '".$wpdb->escape($link->settings_to_notes())."'";
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;
75 92
76 - $alter_set = implode(", ", $alter);
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());
77 96
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;
97 + $globalMatchLabels = array();
98 + $nothingDoing = array('cats' => "won't try to match", 'tags' => "won't try to match", "filter" => "won't filter");
85 99
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));
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);
95 109 else :
96 - delete_option('feedwordpress_syndication_cats');
110 + $globalMatchLabels[$what] = $nothingDoing[$what];
97 111 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;
112 + endforeach;
105 113
106 - update_option('feedwordpress_unfamiliar_category', $_REQUEST['unfamiliar_category']);
114 + if ($this->for_feed_settings()) :
115 + $href = $this->admin_page_href(basename(__FILE__));
107 116
108 - $updated_link = true;
109 - endif;
110 - else :
111 - $updated_link = false;
112 - endif;
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;
113 138
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';
139 + $ucKey[$what] = $link->setting("unfamiliar $what", NULL, NULL);
140 + endforeach;
123 141
124 - if (is_array($link->settings['cats'])) : $cats = $link->settings['cats'];
125 - else : $cats = array();
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;
126 151 endif;
127 152
128 - $tags = $link->settings['tags'];
129 - else :
130 - $ucKey = FeedWordPress::on_unfamiliar('category');
131 - $ucDefault = 'create';
153 + foreach ($ucKey as $what => $uck) :
154 + if ($uck == 'tag') : $uck = 'create:post_tag'; endif;
155 + if ($uck == 'create') : $uck = 'create:category'; endif;
132 156
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;
157 + if ( !is_string($uck)) :
158 + $uck = $unmatchedDefault[$what];
159 + endif;
160 + $ucKey[$what] = $uck;
140 161
141 - if (!is_string($ucKey) or !array_key_exists($ucKey, $unfamiliar)) :
142 - $ucKey = $ucDefault;
143 - endif;
144 - $unfamiliar[$ucKey] = ' checked="checked"';
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;
145 171
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';
172 + $unmatchedRadio[$what][$uck] .= ' checked="checked"';
151 173
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>
174 + $unmatchedColumns[$what][] = $unmatched[$what];
175 + endforeach;
166 176
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; ?>
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;
172 187
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');
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;
177 196
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>
197 + // Hey ho, let's go...
198 + $offerSiteWideSettings = ($page->for_feed_settings() and ($post_type==$globalPostType));
199 + ?>
200 +<table class="edit-form narrow">
201 +<tr>
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>
193 214 <?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>
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>
195 231
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>
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>
201 236
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; */ ?>
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 260
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>
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>
264 280 <?php else : ?>
265 - <p>These settings affect posts syndicated from any feed unless they are overridden
266 - by settings for that specific feed.</p>
281 + <p>
267 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>
268 299
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 300 <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>
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>
278 304
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>
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;">
283 342 <?php endif; ?>
284 343
285 -<li><label><input type="radio" name="unfamiliar_category" value="create"<?php echo $unfamiliar['create']; ?> /> create a new category</label></li>
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>
286 351
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>
352 +<?php if ($offerSiteWideSettings) : ?>
353 + </div>
354 + </td></tr>
355 + </tbody>
356 + </table>
289 357 <?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>
358 +</td>
294 359 </tr>
295 -
296 -<?php if (is_object($link) and $link->found()) : ?>
360 +<?php if ($page->for_feed_settings()) : ?>
297 361 <tr>
298 362 <th scope="row">Multiple categories:</th>
299 -<td>
300 -<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; ?>" />
301 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
302 366 categories in a single category element. The regular expression should match
303 367 the characters used to separate one category from the next. If the feed uses
304 368 spaces (like <a href="http://del.icio.us/">del.icio.us</a>), use the pattern "\s".
@@ -306,46 +370,254 @@
306 370 blank.</p></td>
307 371 </tr>
308 372 <?php endif; ?>
309 373 </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>
374 + <?php
375 + } /* FeedWordPressCategoriesPage::feed_categories_box() */
328 376
329 -<p class="submit">
330 -<input class="button-primary" type="submit" name="save" value="Save Changes" />
331 -</p>
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 + }
332 389
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 () */
390 + function categories_box ($page, $box = NULL) {
391 + $link = $page->link;
392 + $dummy = null;
393 + $syndicatedlink = new SyndicatedLink($dummy);
349 394
350 - fwp_categories_page();
395 + if ($this->for_feed_settings()) :
396 + $post_type = $link->setting('syndicated post type', 'syndicated_post_type', 'post');
397 + else :
398 + $post_type = get_option('feedwordpress_syndicated_post_type', 'post');
399 + endif;
400 + $taxonomies = get_object_taxonomies(array('object_type' => $post_type), 'names');
401 +
402 + $option_map = $this->term_option_map();
403 + $setting_map = $this->term_setting_map();
404 + $globalTax = get_option('feedwordpress_syndication_terms', array());
405 + if ($page->for_feed_settings()) :
406 + $terms = $link->setting('terms', NULL, array());
407 + endif;
408 +
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);
427 +
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"';
432 +
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;
445 +
446 + if ($page->for_feed_settings()) :
447 + ?>
448 + <table class="twofer">
449 + <tbody>
450 + <tr>
451 + <td class="primary">
452 + <?php
453 + endif;
454 +
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;
462 +
463 + $globalDogs = $syndicatedlink->category_ids(/*post=*/ NULL, $globalCats, /*unfamiliar=*/ 'create:'.$tax, /*taxonomies=*/ array($tax));
464 +
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 );
522 + endforeach;
523 + endif;
524 + $optionMap = $this->term_option_map();
525 + $settingMap = $this->term_setting_map();
526 +
527 + $saveTerms = array(); $separateSaveTerms = array('category' => array(), 'post_tag' => array());
528 +
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 );
535 +
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);
547 + endif;
548 + $saveTerms[$tax] = array_map('trim', $saveTerms[$tax]);
549 +
550 + if (isset($optionMap[$tax])) :
551 + $separateSaveTerms[$tax] = $saveTerms[$tax];
552 + unset($saveTerms[$tax]);
553 + endif;
554 + endforeach;
555 +
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 + );
569 + endif;
570 + endforeach;
571 +
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));
579 + else :
580 + delete_option($optionMap[$tax]);
581 + endif;
582 + endif;
583 + endforeach;
584 +
585 + // Other terms
586 + $this->update_setting(array('feed'=>'terms', 'global'=>'syndication_terms'), $saveTerms, array());
587 +
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;
594 +
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;
602 + endif;
603 + endif;
604 + parent::save_settings();
605 + } /* FeedWordPressCategoriesPage::save_settings() */
606 +
607 + function display () {
608 + ////////////////////////////////////////////////
609 + // Display settings boxes //////////////////////
610 + ////////////////////////////////////////////////
611 +
612 + $this->boxes_by_methods = array(
613 + 'feed_categories_box' => __('Feed Categories & Tags'),
614 + 'categories_box' => array('title' => __('Categories'), 'id' => 'categorydiv'),
615 + );
616 +
617 + parent::display();
618 + }
619 +}
620 +
621 + $categoriesPage = new FeedWordPressCategoriesPage;
622 + $categoriesPage->display();
351 623