PluginProbe
FeedWordPress / 2022.0203
FeedWordPress v2022.0203
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 | posts-page.php +471 -303 2010.05282022.0203 View file →
@@ -10,113 +10,153 @@
10 10 * Construct the posts page object.
11 11 *
12 12 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
13 13 */
14 - function FeedWordPressPostsPage ($link = NULL) {
15 - FeedWordPressAdminPage::FeedWordPressAdminPage('feedwordpresspostspage', $link);
16 - $this->dispatch = 'feedwordpress_posts_settings';
14 + public function __construct( $link = -1 ) {
15 + if (is_numeric($link) and -1 == $link) :
16 + $link = $this->submitted_link();
17 + endif;
18 +
19 + parent::__construct('feedwordpresspostspage', $link);
20 + $this->dispatch = 'feedwordpress_admin_page_posts';
17 21 $this->filename = __FILE__;
18 22 $this->updatedPosts = new UpdatedPostsControl($this);
23 +
24 + $this->pagenames = array(
25 + 'default' => 'Posts',
26 + 'settings-update' => 'Syndicated posts',
27 + 'open-sheet' => 'Syndicated Posts & Links',
28 + );
19 29 } /* FeedWordPressPostsPage constructor */
20 30
21 - function accept_POST ($post) {
22 - global $wpdb;
31 + function save_settings ($post) {
32 + // custom post settings
33 + $custom_settings = $this->custom_post_settings();
23 34
24 - // User mashed a Save Changes button
25 - if (isset($post['save']) or isset($post['submit'])) :
26 - // custom post settings
27 - $custom_settings = $this->custom_post_settings();
28 -
29 - foreach ($post['notes'] as $mn) :
35 + foreach ($post['notes'] as $mn) :
36 + if (isset($mn['key0'])) :
30 37 $mn['key0'] = trim($mn['key0']);
31 - $mn['key1'] = trim($mn['key1']);
32 -
33 38 if (strlen($mn['key0']) > 0) :
34 39 unset($custom_settings[$mn['key0']]); // out with the old
35 40 endif;
41 + endif;
36 42
43 + if (isset($mn['key1'])) :
44 + $mn['key1'] = trim($mn['key1']);
45 +
37 46 if (($mn['action']=='update') and (strlen($mn['key1']) > 0)) :
38 47 $custom_settings[$mn['key1']] = $mn['value']; // in with the new
39 48 endif;
49 + endif;
50 + endforeach;
51 +
52 + $this->updatedPosts->accept_POST($post);
53 + if ($this->for_feed_settings()) :
54 + $alter = array ();
55 +
56 + $this->link->settings['postmeta'] = serialize($custom_settings);
57 +
58 + if (isset($post['resolve_relative'])) :
59 + $this->link->settings['resolve relative'] = $post['resolve_relative'];
60 + endif;
61 + if (isset($post['munge_permalink'])) :
62 + $this->link->settings['munge permalink'] = $post['munge_permalink'];
63 + endif;
64 + if (isset($post['munge_comments_feed_links'])) :
65 + $this->link->settings['munge comments feed links'] = $post['munge_comments_feed_links'];
66 + endif;
67 +
68 + // Post status, comment status, ping status
69 + foreach (array('post', 'comment', 'ping') as $what) :
70 + $sfield = "feed_{$what}_status";
71 + if (isset($post[$sfield])) :
72 + if ($post[$sfield]=='site-default') :
73 + unset($this->link->settings["{$what} status"]);
74 + else :
75 + $this->link->settings["{$what} status"] = $post[$sfield];
76 + endif;
77 + endif;
40 78 endforeach;
41 -
42 - $this->updatedPosts->accept_POST($post);
43 - if ($this->for_feed_settings()) :
44 - $alter = array ();
45 -
46 - $this->link->settings['postmeta'] = serialize($custom_settings);
47 -
48 - if (isset($post['resolve_relative'])) :
49 - $this->link->settings['resolve relative'] = $post['resolve_relative'];
79 +
80 + if (isset($post['syndicated_post_type'])) :
81 + if ($post['syndicated_post_type']=='default') :
82 + unset($this->link->settings['syndicated post type']);
83 + else :
84 + $this->link->settings['syndicated post type'] = $post['syndicated_post_type'];
50 85 endif;
51 - if (isset($post['munge_permalink'])) :
52 - $this->link->settings['munge permalink'] = $post['munge_permalink'];
53 - endif;
54 - if (isset($post['munge_comments_feed_links'])) :
55 - $this->link->settings['munge comments feed links'] = $post['munge_comments_feed_links'];
56 - endif;
86 + endif;
57 87
58 - // Post status, comment status, ping status
59 - foreach (array('post', 'comment', 'ping') as $what) :
60 - $sfield = "feed_{$what}_status";
61 - if (isset($post[$sfield])) :
62 - if ($post[$sfield]=='site-default') :
63 - unset($this->link->settings["{$what} status"]);
64 - else :
65 - $this->link->settings["{$what} status"] = $post[$sfield];
66 - endif;
67 - endif;
68 - endforeach;
88 + else :
89 + // update_option ...
90 + if (isset($post['feed_post_status'])) :
91 + update_option('feedwordpress_syndicated_post_status', $post['feed_post_status']);
92 + endif;
69 93
70 - // Save settings
71 - $this->link->save_settings(/*reload=*/ true);
72 - $this->updated = true;
94 + update_option('feedwordpress_custom_settings', serialize($custom_settings));
95 +
96 + $sMungePermalink = sanitize_text_field($_REQUEST['munge_permalink']);
97 + $sUseAggregatorSourceData = sanitize_text_field($_REQUEST['use_aggregator_source_data']);
98 + $sFormattingFilters = sanitize_text_field($_REQUEST['formatting_filters']);
99 + $sFeedCommentStatus = (isset($_REQUEST['feed_comment_status']) ? sanitize_text_field($_REQUEST['feed_comment_status']) : '');
100 + $sFeedPingStatus = (isset($_REQUEST['feed_ping_status']) ? sanitize_text_field($_REQUEST['feed_ping_status']) : '');
101 +
102 + update_option('feedwordpress_munge_permalink', $sMungePermalink);
103 + update_option('feedwordpress_use_aggregator_source_data', $sUseAggregatorSourceData);
104 + update_option('feedwordpress_formatting_filters', $sFormattingFilters);
73 105
74 - // Reset, reload
75 - $link_id = $this->link->id;
76 - unset($this->link);
77 - $this->link = new SyndicatedLink($link_id);
106 + if (isset($post['resolve_relative'])) :
107 + update_option('feedwordpress_resolve_relative', $post['resolve_relative']);
108 + endif;
109 + if (isset($post['munge_comments_feed_links'])) :
110 + update_option('feedwordpress_munge_comments_feed_links', $post['munge_comments_feed_links']);
111 + endif;
112 +
113 + if ( $sFeedCommentStatus == 'open' ) :
114 + update_option('feedwordpress_syndicated_comment_status', 'open');
78 115 else :
79 - // update_option ...
80 - if (isset($post['feed_post_status'])) :
81 - update_option('feedwordpress_syndicated_post_status', $post['feed_post_status']);
82 - endif;
116 + update_option('feedwordpress_syndicated_comment_status', 'closed');
117 + endif;
83 118
84 - update_option('feedwordpress_custom_settings', serialize($custom_settings));
85 -
86 - update_option('feedwordpress_munge_permalink', $_REQUEST['munge_permalink']);
87 - update_option('feedwordpress_use_aggregator_source_data', $_REQUEST['use_aggregator_source_data']);
88 - update_option('feedwordpress_formatting_filters', $_REQUEST['formatting_filters']);
89 -
90 - if (isset($post['resolve_relative'])) :
91 - update_option('feedwordpress_resolve_relative', $post['resolve_relative']);
92 - endif;
93 - if (isset($post['munge_comments_feed_links'])) :
94 - update_option('feedwordpress_munge_comments_feed_links', $post['munge_comments_feed_links']);
95 - endif;
96 - if (isset($_REQUEST['feed_comment_status']) and ($_REQUEST['feed_comment_status'] == 'open')) :
97 - update_option('feedwordpress_syndicated_comment_status', 'open');
98 - else :
99 - update_option('feedwordpress_syndicated_comment_status', 'closed');
100 - endif;
119 + if ( $sFeedPingStatus == 'open' ) :
120 + update_option('feedwordpress_syndicated_ping_status', 'open');
121 + else :
122 + update_option('feedwordpress_syndicated_ping_status', 'closed');
123 + endif;
124 +
125 + if (isset($post['syndicated_post_type'])) :
126 + update_option('feedwordpress_syndicated_post_type', $post['syndicated_post_type']);
127 + endif;
128 + endif;
101 129
102 - if (isset($_REQUEST['feed_ping_status']) and ($_REQUEST['feed_ping_status'] == 'open')) :
103 - update_option('feedwordpress_syndicated_ping_status', 'open');
130 + if (isset($post['save']) or isset($post['submit'])) :
131 + if (isset($post['boilerplate'])) :
132 + foreach ($post['boilerplate'] as $index => $line) :
133 + if (0 == strlen(trim($line['template']))) :
134 + unset($post['boilerplate'][$index]);
135 + endif;
136 + endforeach;
137 +
138 + // Convert indexes to 0..(N-1) to avoid possible collisions
139 + $post['boilerplate'] = array_values($post['boilerplate']);
140 +
141 + if ($this->for_feed_settings()) :
142 + $this->link->settings['boilerplate rules'] = serialize($post['boilerplate']);
143 + $this->link->save_settings(/*reload=*/ true);
104 144 else :
105 - update_option('feedwordpress_syndicated_ping_status', 'closed');
145 + update_option('feedwordpress_boilerplate', $post['boilerplate']);
106 146 endif;
147 + endif;
107 148
108 - $this->updated = true;
149 + if (isset($post['boilerplate_hook_order'])) :
150 + $this->update_setting('boilerplate hook order', intval($post['boilerplate_hook_order']));
109 151 endif;
152 + endif;
110 153
111 - // Probably a "Go" button for the drop-down
112 - else :
113 - $this->updated = false;
114 - endif;
154 + parent::save_settings($post);
115 155 }
116 156
117 157 /**
118 - * Outputs "Publication" settings box.
158 + * publication_box: Outputs "Publication" settings box.
119 159 *
120 160 * @since 2009.0713
121 161 * @param object $page of class FeedWordPressPostsPage tells us whether this is
122 162 * a page for one feed's settings or for global defaults
@@ -124,71 +164,41 @@
124 164 *
125 165 * @uses FeedWordPressPostsPage::these_posts_phrase()
126 166 * @uses FeedWordPress::syndicated_status()
127 167 * @uses SyndicatedLink::syndicated_status()
128 - * @uses SyndicatedPost::use_api()
129 168 */
130 169 /*static*/ function publication_box ($page, $box = NULL) {
131 - global $fwp_path;
132 -
133 - $post_status_global = FeedWordPress::syndicated_status('post', /*default=*/ 'publish');
134 170 $thesePosts = $page->these_posts_phrase();
135 -
136 - // Set up array for selector
137 - $setting = array(
138 - 'publish' => array ('label' => "Publish %s immediately", 'checked' => ''),
139 - 'draft' => array('label' => "Save %s as drafts", 'checked' => ''),
140 - 'private' => array('label' => "Save %s as private posts", 'checked' => ''),
171 + $postSelector = array(
172 + 'publish' => "Publish %s immediately",
173 + 'pending' => "Hold %s for review; mark as Pending",
174 + 'draft' => "Save %s as drafts",
175 + 'private' => "Save %s as private posts",
141 176 );
142 - if (SyndicatedPost::use_api('post_status_pending')) :
143 - $setting['pending'] = array('label' => "Hold %s for review; mark as Pending", 'checked' => '');
144 - endif;
177 + $labels = array();
178 + foreach ($postSelector as $index => $value) :
179 + $postSelector[$index] = sprintf(__($value), $thesePosts);
180 + $labels[$index] = __(str_replace(' %s', '', strtolower(strtok($value, ';'))));
181 + endforeach;
182 +
183 + $params = array(
184 + 'input-name' => 'feed_post_status',
185 + 'setting-default' => NULL,
186 + 'global-setting-default' => 'publish',
187 + 'labels' => $labels,
188 + );
145 189
146 -
147 - if ($page->for_feed_settings()) :
148 - $href = $fwp_path.'/'.basename(__FILE__);
149 - $currently = str_replace('%s', '', strtolower(strtok($setting[$post_status_global]['label'], ';')));
150 - $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
151 - $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
152 -
153 - $checked = $page->link->syndicated_status('post', 'site-default', /*fallback=*/ false);
154 - else :
155 - $checked = $post_status_global;
156 - endif;
157 -
158 - // Re-order appropriately
159 - $selector = array();
160 - $order = array(
161 - 'site-default',
162 - 'publish',
163 - 'pending',
164 - 'draft',
165 - 'private',
166 - );
167 - foreach ($order as $line) :
168 - if (isset($setting[$line])) :
169 - $selector[$line] = $setting[$line];
170 - endif;
171 - endforeach;
172 - $selector[$checked]['checked'] = ' checked="checked"';
173 -
174 190 // Hey ho, let's go...
175 191 ?>
176 - <style type="text/css">
177 - #syndicated-publication-form th { width: 27%; vertical-align: top; }
178 - #syndicated-publication-form td { width: 73%; vertical-align: top; }
179 - </style>
180 -
181 - <table id="syndicated-publication-form" class="form-table" cellspacing="2" cellpadding="5">
192 + <table id="syndicated-publication-form" class="edit-form narrow">
182 193 <tr><th scope="row"><?php _e('New posts:'); ?></th>
183 - <td><ul class="options">
184 - <?php foreach ($selector as $code => $li) : ?>
185 - <li><label><input type="radio" name="feed_post_status"
186 - value="<?php print $code; ?>"<?php print $li['checked']; ?> />
187 - <?php print str_replace('%s', $thesePosts, $li['label']); ?></label></li>
188 - <?php endforeach; ?>
189 - </ul></td>
190 - </tr>
194 + <td><?php
195 + $this->setting_radio_control(
196 + 'post status', 'syndicated_post_status',
197 + $postSelector, $params
198 + );
199 + ?>
200 + </td></tr>
191 201
192 202 <?php $page->updatedPosts->display(); ?>
193 203 </table>
194 204
@@ -204,27 +214,19 @@
204 214 * @param array $box
205 215 *
206 216 */
207 217 function formatting_box ($page, $box = NULL) {
208 - global $fwp_path;
209 218 $thesePosts = $page->these_posts_phrase();
210 - $global_resolve_relative = get_option('feedwordpress_resolve_relative', 'yes');
219 +
211 220 if ($page->for_feed_settings()) :
212 221 $formatting_filters = null;
213 - $resolve_relative = $page->link->setting('resolve relative', NULL, 'default');
214 222 $url = preg_replace('|/+$|', '', $page->link->homepage());
215 - $setting = array(
216 - 'yes' => __('resolve relative URIs'),
217 - 'no' => __('leave relative URIs unresolved'),
218 - );
219 - $href = $fwp_path.'/'.basename(__FILE__);
220 223 else :
221 224 $formatting_filters = get_option('feedwordpress_formatting_filters', 'no');
222 - $resolve_relative = $global_resolve_relative;
223 225 $url = 'http://example.com';
224 226 endif;
225 227 ?>
226 - <table class="form-table" cellspacing="2" cellpadding="5">
228 + <table class="edit-form narrow">
227 229 <?php if (!is_null($formatting_filters)) : ?>
228 230
229 231 <tr><th scope="row">Formatting filters:</th>
230 232 <td><select name="formatting_filters" size="1">
@@ -239,22 +241,32 @@
239 241
240 242 <?php endif; ?>
241 243
242 244 <tr><th scope="row">Relative URIs:</th>
243 - <td>If link or image in a syndicated post from <code><?php print $url; ?></code>
245 + <td><p>If link or image in a syndicated post from <code><?php print esc_html($url); ?></code>
244 246 refers to a partial URI like <code>/about</code>, where should
245 247 the syndicated copy point to?</p>
246 248
247 - <ul>
248 - <?php if ($page->for_feed_settings()) : ?>
249 - <li><p><label><input type="radio" name="resolve_relative" value='default' <?php echo ($resolve_relative=='default')?' checked="checked"':''; ?>/> Use <a href="admin.php?page=<?php print $href; ?>">site-wide setting</a><br/>
250 - <small style="margin-left: 2.0em;">Currently: <strong><?php print $setting[$global_resolve_relative]; ?></strong></small></label></p></li>
251 - <?php endif; ?>
252 - <li><p><label><input type="radio" name="resolve_relative" value="yes"<?php echo ($resolve_relative!='no' and $resolve_relative!='default')?' checked="checked"':''; ?>/> Resolve the URI so it points to <code><?php print $url; ?></code><br/>
253 - <small style="margin-left: 2.0em;"><code>/contact</code> is rewritten as <code><?php print $url; ?>/contact</code></label></small></p></li>
254 - <li><p><label><input type="radio" name="resolve_relative" value="no"<?php echo ($resolve_relative=='no')?' checked="checked"':''; ?>/> Leave relative URIs unchanged, so they point to this site<br/>
255 - <small style="margin-left: 2.0em;"><code>/contact</code> is left as <code>/contact</code></small></label></li>
256 - </ul>
249 + <?php
250 + $options = array(
251 + 'yes' => 'Resolve the URI so it points to <code>'.$url.'</code><br/><small style="margin-left: 2.0em;"><code>/contact</code> is rewritten as <code>'.$url.'/contact</code></small>',
252 + 'no' => 'Leave relative URIs unchanged, so they point to this site<br/><small style="margin-left: 2.0em;"><code>/contact</code> is left as <code>/contact</code></small>',
253 + );
254 + $params = array(
255 + 'setting-default' => 'default',
256 + 'global-setting-default' => 'yes',
257 + 'labels' => array(
258 + 'yes' => __('resolve relative URIs'),
259 + 'no' => __('leave relative URIs unresolved'),
260 + ),
261 + 'default-input-value' => 'default',
262 + );
263 +
264 + $this->setting_radio_control(
265 + 'resolve relative', 'resolve_relative',
266 + $options, $params
267 + );
268 + ?>
257 269 </td></tr>
258 270
259 271 </table>
260 272 <?php
@@ -271,33 +283,34 @@
271 283 */
272 284 /*static*/ function links_box ($page, $box = NULL) {
273 285 $setting = array(
274 286 'munge_permalink' => array(
275 - 'yes' => 'the copy on the original website',
276 - 'no' => 'the local copy on this website',
287 + 'yes' => __('The copy on the original website'),
288 + 'no' => __('The local copy on this website'),
277 289 ),
278 290 );
279 291
280 - $global_munge_permalink = get_option('feedwordpress_munge_permalink');
281 - if ($page->for_feed_settings()) :
282 - $munge_permalink = $page->link->setting('munge permalink', NULL);
283 - else :
284 - $munge_permalink = $global_munge_permalink;
292 + if (!$page->for_feed_settings()) :
285 293 $use_aggregator_source_data = get_option('feedwordpress_use_aggregator_source_data');
286 294 endif;
287 -
288 295 ?>
289 - <table class="form-table" cellspacing="2" cellpadding="5">
296 + <table class="edit-form narrow">
290 297 <tr><th scope="row">Permalinks point to:</th>
291 - <td><ul class="options">
292 - <?php if ($page->for_feed_settings()) : ?>
293 - <li><label><input type="radio" name="munge_permalink" value="default"<?php echo ($munge_permalink!='yes' and $munge_permalink != 'no')?' checked="checked"':''; ?>/> use site-wide setting (currently <?php print $setting['munge_permalink'][$global_munge_permalink]; ?>)</label></li>
294 - <?php endif; ?>
295 - <li><label><input type="radio" name="munge_permalink" value="yes"<?php echo ($munge_permalink=='yes')?' checked="checked"':''; ?>><?php print $setting['munge_permalink']['yes']; ?></label></li>
296 - <li><label><input type="radio" name="munge_permalink" value="no"<?php echo ($munge_permalink=='no')?' checked="checked"':''; ?>><?php print $setting['munge_permalink']['no']; ?></label></li>
297 - </ul></td>
298 - </tr>
298 + <td><?php
299 299
300 + $params = array(
301 + 'setting-default' => 'default',
302 + 'global-setting-default' => 'yes',
303 + 'default-input-value' => 'default',
304 + );
305 + $this->setting_radio_control(
306 + 'munge permalink', 'munge_permalink',
307 + $setting['munge_permalink'], $params
308 + );
309 + ?>
310 +
311 + </td></tr>
312 +
300 313 <?php if (!$page->for_feed_settings()) : ?>
301 314 <tr><th scope="row">Posts from aggregator feeds:</th>
302 315 <td><ul class="options">
303 316 <li><label><input type="radio" name="use_aggregator_source_data" value="no"<?php echo ($use_aggregator_source_data!="yes")?' checked="checked"':''; ?>> Give the aggregator itself as the source of posts from an aggregator feed.</label></li>
@@ -322,95 +335,73 @@
322 335 * @param array $box
323 336 *
324 337 */
325 338 /*static*/ function comments_and_pings_box ($page, $box = NULL) {
326 - global $fwp_path;
327 -
328 - $setting = array();
329 - $selector = array();
330 -
331 339 $whatsits = array(
332 340 'comment' => array('label' => __('Comments'), 'accept' => 'Allow comments'),
333 341 'ping' => array('label' => __('Pings'), 'accept' => 'Accept pings'),
334 342 );
335 343 $onThesePosts = 'on '.$page->these_posts_phrase();
336 -
337 - $selected = array(
338 - 'munge_comments_feed_links' => array('yes' => '', 'no' => '')
344 +
345 + $mcflSettings = array(
346 + "yes" => __('Point to comment feeds from the original website (when provided by the syndicated feed)'),
347 + "no" => __('Point to local comment feeds on this website'),
339 348 );
340 -
341 - $globalMungeCommentsFeedLinks = get_option('feedwordpress_munge_comments_feed_links', 'yes');
342 - if ($page->for_feed_settings()) :
343 - $selected['munge_comments_feed_links']['default'] = '';
344 -
345 - $sel = $page->link->setting('munge comments feed links', NULL, 'default');
346 - else :
347 - $sel = $globalMungeCommentsFeedLinks;
348 - endif;
349 - $selected['munge_comments_feed_links'][$sel] = ' checked="checked"';
350 -
351 - if ($globalMungeCommentsFeedLinks != 'no') : $siteWide = __('comment feeds from the original website');
352 - else : $siteWide = __('local comment feeds on this website');
353 - endif;
349 + $mcflParams = array(
350 + 'setting-default' => 'default',
351 + 'global-setting-default' => 'yes',
352 + 'labels' => array(
353 + 'yes' => __('comment feeds from the original website'),
354 + 'no' => __('local comment feeds on this website')
355 + ),
356 + 'default-input-value' => 'default',
357 + );
354 358
359 + $settings = array(); $params = array();
355 360 foreach ($whatsits as $what => $how) :
356 361 $whatsits[$what]['default'] = FeedWordPress::syndicated_status($what, /*default=*/ 'closed');
357 362
358 363 // Set up array for selector
359 - $setting = array(
360 - 'open' => array ('label' => "{$how['accept']} %s", 'checked' => ''),
361 - 'closed' => array('label' => "Don't ".strtolower($how['accept'])." %s", 'checked' => ''),
364 + $settings[$what] = array(
365 + 'open' => sprintf(__("{$how['accept']} %s"), __($onThesePosts)),
366 + 'closed' => sprintf(__("Don't ".strtolower($how['accept'])." %s"), __($onThesePosts)),
362 367 );
363 - if ($page->for_feed_settings()) :
364 - $href = $fwp_path.'/'.basename(__FILE__);
365 - $currently = trim(str_replace('%s', '', strtolower(strtok($setting[$whatsits[$what]['default']]['label'], ';'))));
366 - $setting['site-default'] = array('label' => "Use <a href=\"admin.php?page=${href}\">site-wide setting</a>", 'checked' => '');
367 - $setting['site-default']['label'] .= " (currently: <strong>${currently}</strong>)";
368 -
369 - $checked = $page->link->syndicated_status($what, 'site-default', /*fallback=*/ false);
370 - else :
371 - $checked = $whatsits[$what]['default'];
372 - endif;
373 -
374 - // Re-order appropriately
375 - $selector[$what] = array();
376 - $order = array(
377 - 'site-default',
378 - 'open',
379 - 'closed',
368 + $params[$what] = array(
369 + 'input-name' => "feed_${what}_status",
370 + 'setting-default' => NULL,
371 + 'global-setting-default' => FeedWordPress::syndicated_status($what, /*default=*/ 'closed'),
372 + 'labels' => array(
373 + 'open' => strtolower(__($how['accept'])),
374 + 'closed' => strtolower(__("Don't ".$how['accept'])),
375 + ),
380 376 );
381 - foreach ($order as $line) :
382 - if (isset($setting[$line])) :
383 - $selector[$what][$line] = $setting[$line];
384 - endif;
385 - endforeach;
386 - $selector[$what][$checked]['checked'] = ' checked="checked"';
387 377 endforeach;
388 378
389 379 // Hey ho, let's go...
390 380 ?>
391 - <table class="form-table" cellspacing="2" cellpadding="5">
381 + <table class="edit-form narrow">
392 382 <?php foreach ($whatsits as $what => $how) : ?>
393 - <tr><th scope="row"><?php print $how['label']; ?>:</th>
394 - <td><ul class="options">
395 - <?php foreach ($selector[$what] as $code => $li) : ?>
396 - <li><label><input type="radio" name="feed_<?php print $what; ?>_status"
397 - value="<?php print $code; ?>"<?php print $li['checked']; ?> />
398 - <?php print trim(str_replace('%s', $onThesePosts, $li['label'])); ?></label></li>
399 - <?php endforeach; ?>
400 - </ul></td></tr>
383 +
384 + <tr><th scope="row"><?php print esc_html($how['label']); ?>:</th>
385 + <td><?php
386 + $this->setting_radio_control(
387 + "$what status", "syndicated_${what}_status",
388 + $settings[$what], $params[$what]
389 + );
390 + ?></td></tr>
391 +
401 392 <?php endforeach; ?>
393 +
402 394 <tr><th scope="row"><?php _e('Comment feeds'); ?></th>
403 395 <td><p>When WordPress feeds and templates link to comments
404 - feeds for <?php print $page->these_posts_phrase(); ?>, the
396 + feeds for <?php print esc_html($page->these_posts_phrase()); ?>, the
405 397 URLs for the feeds should...</p>
406 - <ul class="options">
407 - <?php if ($page->for_feed_settings()) : ?>
408 - <li><label><input type="radio" name="munge_comments_feed_links" value="default"<?php print $selected['munge_comments_feed_links']['default']; ?> /> Use <a href="admin.php?page=<?php print $href; ?>">site-wide setting</a> (currently: <strong><?php _e($siteWide); ?></strong>)</label></li>
409 - <?php endif; ?>
410 - <li><label><input type="radio" name="munge_comments_feed_links" value="yes"<?php print $selected['munge_comments_feed_links']['yes']; ?> /> <?php _e('Point to comment feeds from the original website (when provided by the syndicated feed)'); ?></label></li>
411 - <li><label><input type="radio" name="munge_comments_feed_links" value="no"<?php print $selected['munge_comments_feed_links']['no']; ?> /> <?php _e('Point to local comment feeds on this website'); ?></label></li>
412 - </ul></td></tr>
398 + <?php
399 + $this->setting_radio_control(
400 + "munge comments feed links", "munge_comments_feed_links",
401 + $mcflSettings, $mcflParams
402 + );
403 + ?></td></tr>
413 404 </table>
414 405
415 406 <?php
416 407 } /* FeedWordPressPostsPage::comments_and_pings_box() */
@@ -420,9 +411,9 @@
420 411 $page = $this;
421 412 endif;
422 413
423 414 if ($page->for_feed_settings()) :
424 - $custom_settings = $page->link->settings["postmeta"];
415 + $custom_settings = $page->link->setting("postmeta", NULL, array());
425 416 else :
426 417 $custom_settings = get_option('feedwordpress_custom_settings');
427 418 endif;
428 419
@@ -458,15 +449,19 @@
458 449 </tr>
459 450
460 451 <?php
461 452 $i = 0;
462 - foreach ($custom_settings as $key => $value) :
453 + $testerButton = '<br/><button id="xpath-test-%d"'
454 + .'class="xpath-test"'
455 + .'>test expression</button>';
456 + foreach ($custom_settings as $key => $value) :
463 457 ?>
464 458 <tr style="vertical-align:top">
465 - <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo $i; ?>][key0]" value="<?php echo esc_html($key); ?>" />
466 - <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo $i; ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
467 - <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo $i; ?>-value" name="notes[<?php echo $i; ?>][value]"><?php echo esc_html($value); ?></textarea></td>
468 - <td width="10%"><select name="notes[<?php echo $i; ?>][action]">
459 + <th width="30%" scope="row"><input type="hidden" name="notes[<?php echo esc_attr($i); ?>][key0]" value="<?php echo esc_html($key); ?>" />
460 + <input id="notes-<?php echo $i; ?>-key" name="notes[<?php echo esc_attr($i); ?>][key1]" value="<?php echo esc_html($key); ?>" /></th>
461 + <td width="60%"><textarea rows="2" cols="40" id="notes-<?php echo esc_attr($i); ?>-value" name="notes[<?php echo esc_attr($i); ?>][value]"><?php echo esc_html($value); ?></textarea>
462 + <?php print sprintf($testerButton, esc_attr($i) ); ?></td>
463 + <td width="10%"><select name="notes[<?php echo esc_attr($i); ?>][action]">
469 464 <option value="update">save changes</option>
470 465 <option value="delete">delete this setting</option>
471 466 </select></td>
472 467 </tr>
@@ -476,10 +471,10 @@
476 471 endforeach;
477 472 ?>
478 473
479 474 <tr style="vertical-align: top">
480 - <th scope="row"><input type="text" size="10" name="notes[<?php echo $i; ?>][key1]" value="" /></th>
481 - <td><textarea name="notes[<?php echo $i; ?>][value]" rows="2" cols="40"></textarea>
475 + <th scope="row"><input type="text" size="10" name="notes[<?php echo esc_attr($i); ?>][key1]" value="" /></th>
476 + <td><textarea name="notes[<?php echo esc_attr($i); ?>][value]" rows="2" cols="40"></textarea><?php print sprintf($testerButton, esc_attr($i)); ?>
482 477 <p>Enter a text value, or a path to a data element from the syndicated item.<br/>
483 478 For data elements, you can use an XPath-like syntax wrapped in <code>$( ... )</code>.<br/>
484 479 <code>hello</code> = the text value <code><span style="background-color: #30FFA0;">hello</span></code><br/>
485 480 <code>$(author/email)</code> = the contents of <code>&lt;author&gt;&lt;email&gt;<span style="background-color: #30FFA0">...</span>&lt;/email&gt;&lt;/author&gt;</code><br/>
@@ -484,89 +479,262 @@
484 479 <code>hello</code> = the text value <code><span style="background-color: #30FFA0;">hello</span></code><br/>
485 480 <code>$(author/email)</code> = the contents of <code>&lt;author&gt;&lt;email&gt;<span style="background-color: #30FFA0">...</span>&lt;/email&gt;&lt;/author&gt;</code><br/>
486 481 <code>$(media:content/@url)</code> = the contents of <code>&lt;media:content url="<span style="background-color: #30FFA0">...</span>"&gt;...&lt;/media:content&gt;</code></p>
487 482 </td>
488 - <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo $i; ?>][action]" value="update" /></td>
483 + <td><em>add new setting...</em><input type="hidden" name="notes[<?php echo esc_attr($i); ?>][action]" value="update" /></td>
489 484 </tr>
490 485 </table>
491 486 </div> <!-- id="postcustomstuff" -->
492 487
493 488 <?php
494 - } /* FeedWordPressPostsPage::custom_post_settings_box() */
495 -}
489 + } /* FeedWordPressPostsPage::custom_post_settings_box() */
496 490
497 -function fwp_posts_page () {
498 - global $wpdb, $wp_db_version;
499 - global $fwp_post;
491 + function custom_post_types_box ($page, $box = NULL) {
492 + global $fwp_path;
493 +
494 + // local: syndicated post type // default NULL
495 + // global: syndicated_post_type // default 'post'
496 + // default-input-value => 'default'
497 +
498 + // Get all custom post types
499 + $post_types = get_post_types(array(
500 + '_builtin' => false,
501 + ), 'objects');
500 502
501 - if (FeedWordPress::needs_upgrade()) :
502 - fwp_upgrade_page();
503 - return;
504 - endif;
503 + $ul = array();
504 + $ul['post'] = __('Normal WordPress posts');
505 + foreach ($post_types as $post_type) :
506 + $ul[$post_type->name] = __($post_type->labels->name);
507 + endforeach;
508 +
509 + $params = array(
510 + 'global-setting-default' => 'post',
511 + 'default-input-value' => 'default',
512 + );
513 +
514 + // Hey, ho, let's go...
515 + ?>
516 + <table class="edit-form narrow">
517 + <tbody>
518 + <tr><th><?php _e('Custom Post Types:'); ?></th>
519 + <td><p>Incoming syndicated posts should be stored in the
520 + posts database as...</p>
521 + <?php
522 + $this->setting_radio_control(
523 + 'syndicated post type', 'syndicated_post_type',
524 + $ul, $params
525 + );
526 + ?>
527 + </td></tr>
528 + </tbody>
529 + </table>
530 + <?php
531 + } /* FeedWordPressPostsPage::custom_post_types_box() */
532 +
533 + public function boilerplate_box ($page, $box = NULL) {
534 + if ($page->for_feed_settings()) :
535 + $attrib = isset($page->link->settings['boilerplate rules'])
536 + ? unserialize($page->link->settings['boilerplate rules'])
537 + : [];
538 + $syndicatedPosts = 'this feed\'s posts';
539 + else :
540 + $attrib = get_option('feedwordpress_boilerplate');
541 + $syndicatedPosts = 'syndicated posts';
542 + endif;
543 + $hookOrder = intval($page->setting('boilerplate hook order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER));
544 +?>
545 + <style type="text/css">
546 + .boilerplate-help-box {
547 + float: right;
548 + width: 300px;
549 + border: 1px dotted #777;
550 + margin: 3px;
551 + padding: 5px;
552 + background-color: #f7f7f7;
553 + }
554 + .boilerplate-help-box dt {
555 + font-weight: bold;
556 + font-size: 85%;
557 + }
558 + .boilerplate-help-box dd {
559 + font-size: 80%; line-height: 100%; font-style: italic;
560 + padding-left: 1.5em;
561 + }
562 + .boilerplate-help-box code {
563 + font-size: inherit;
564 + font-style: normal;
565 + background-color: inherit;
566 + }
505 567
506 - // If this is a POST, validate source and user credentials
507 - FeedWordPressCompatibility::validate_http_request(/*action=*/ 'feedwordpress_posts_settings', /*capability=*/ 'manage_links');
568 + .boilerplate-li {
569 + padding-bottom: 5px;
570 + margin-bottom: 5px;
571 + border-bottom: 1px dotted black;
572 + }
573 +
574 + </style>
508 575
509 - $link = FeedWordPressAdminPage::submitted_link();
576 + <div class="boilerplate-help-box">
577 + <p style="border-bottom: 1px dotted #777;">To remove boilerplate, just blank out the text box and leave it empty.</p>
510 578
511 - $postsPage = new FeedWordPressPostsPage($link);
579 + <p>Use shortcodes to include information about your source:</p>
580 + <dl>
581 + <dt><code>[source]</code></dt>
582 + <dd>A link to the source you syndicated the post from</dd>
512 583
513 - $mesg = null;
584 + <dt><code>[source-name]</code></dt>
585 + <dd>Name of the source you syndicated the post from</dd>
514 586
515 - ////////////////////////////////////////////////
516 - // Process POST request, if any ////////////////
517 - ////////////////////////////////////////////////
518 - if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
519 - $postsPage->accept_POST($fwp_post);
520 - do_action('feedwordpress_admin_page_posts_save', $fwp_post, $postsPage);
521 - endif;
587 + <dt><code>[source-url]</code></dt>
588 + <dd>URL of the source you syndicated the post from</dd>
589 +
590 + <dt><code>[original-link]text[/original-link]</code></dt>
591 + <dd>A link to the <em>original post</em> back on the source website,
592 + using <code>text</code> as the link text.</dd>
522 593
523 - $postsPage->ajax_interface_js();
594 + <dt><code>[original-url]</code></dt>
595 + <dd>URL of the <em>original post</em> back on the source website</dd>
524 596
525 - if ($postsPage->updated) : ?>
526 -<div class="updated"><p>Syndicated posts settings updated.</p></div>
527 -<?php elseif (!is_null($mesg)) : ?>
528 -<div class="updated"><p><?php print esc_html($mesg); ?></p></div>
529 -<?php endif; ?>
597 + <dt><code>[author]</code></dt>
598 + <dd>A link with the name of the author who wrote the post, linking to other posts by the same author</dd>
530 599
600 + <dt><code>[author-name]</code></dt>
601 + <dd>Name of the author who wrote the post</dd>
602 +
603 + <dt><code>[feed-setting key="setting-name"]</code></dt>
604 + <dd>Value of a custom feed setting (named <code>setting-name</code>) for the feed</dd>
605 + </dl>
606 + </div>
607 +
531 608 <?php
532 - $links = FeedWordPress::syndicated_links();
533 - $postsPage->open_sheet('Syndicated Posts & Links');
609 + print "<ul>\n";
610 + if (!is_array($attrib)) : $attrib = array(); endif;
611 +
612 + print '<input type="hidden" id="next-boilerplate-rule-index" name="next_boilerplate_rule_index" value="'.count($attrib).'" />';
613 +
614 + // In AJAX environment, this is a dummy rule that stays hidden. In a
615 + // non-AJAX environment, this provides a blank rule that we can fill in.
616 + $attrib['new'] = array(
617 + 'class' => array('hide-if-js'),
618 + 'placement' => 'before',
619 + 'element' => 'post',
620 + 'template' => '',
621 + );
622 +
623 + foreach ($attrib as $index => $line) :
624 + if (isset($line['template'])) :
625 + $selected['before'] = (($line['placement']=='before') ? ' selected="selected"' : '');
626 + $selected['after'] = (($line['placement']=='after') ? ' selected="selected"' : '');
627 + $selected['title'] = (($line['element']=='title') ? ' selected="selected"' : '');
628 + $selected['post'] = (($line['element']=='post') ? ' selected="selected"' : '');
629 + $selected['excerpt'] = (($line['element']=='excerpt') ? ' selected="selected"' : '');
630 +
631 + if (!isset($line['class'])) : $line['class'] = array(); endif;
632 + $line['class'][] = 'boilerplate-li';
534 633 ?>
535 -<style type="text/css">
536 - table.edit-form th, table.form-table th { width: 27%; vertical-align: top; }
537 - table.edit-form td, table.form-table td { width: 73%; vertical-align: top; }
538 - ul.options { margin: 0; padding: 0; list-style: none; }
539 -</style>
540 -<div id="post-body">
634 +
635 +<li id="boilerplate-<?php print esc_attr($index); ?>-li" class="<?php print esc_attr(implode(' ', $line['class'])); ?>">&raquo; <strong>Add</strong> <select id="boilerplate-<?php print esc_attr($index); ?>-placement" name="boilerplate[<?php print esc_attr($index); ?>][placement]" style="width: 8.0em">
636 +<option value="before"<?php print $selected['before']; ?>>before</option>
637 +<option value="after"<?php print $selected['after']; ?>>after</option>
638 +</select> the <select style="width: 8.0em" id="boilerplate-<?php print esc_attr($index); ?>-element" name="boilerplate[<?php print esc_attr($index); ?>][element]">
639 +<option value="title"<?php print $selected['title']; ?>>title</option>
640 +<option value="post"<?php print $selected['post']; ?>>content</option>
641 +<option value="excerpt"<?php print $selected['excerpt']; ?>>excerpt</option>
642 +</select> of
643 +<?php print esc_html($syndicatedPosts); ?>: <textarea style="vertical-align: top; width: 40%;" rows="2" cols="30" class="boilerplate-template" id="boilerplate-<?php print esc_attr($index); ?>-template" name="boilerplate[<?php print esc_attr($index); ?>][template]"><?php print esc_html($line['template']); ?></textarea></li>
541 644 <?php
542 -$boxes_by_methods = array(
543 - 'publication_box' => __('Syndicated Posts'),
544 - 'links_box' => __('Links'),
545 - 'formatting_box' => __('Formatting'),
546 - 'comments_and_pings_box' => __('Comments & Pings'),
547 - 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
548 -);
645 + endif;
646 + endforeach;
647 +?>
648 + </ul>
649 + <br style="clear: both" />
549 650
550 - foreach ($boxes_by_methods as $method => $title) :
551 - fwp_add_meta_box(
552 - /*id=*/ 'feedwordpress_'.$method,
553 - /*title=*/ $title,
554 - /*callback=*/ array('FeedWordPressPostsPage', $method),
555 - /*page=*/ $postsPage->meta_box_context(),
556 - /*context=*/ $postsPage->meta_box_context()
557 - );
558 - endforeach;
559 - do_action('feedwordpress_admin_page_posts_meta_boxes', $postsPage);
560 -?>
561 - <div class="metabox-holder">
651 + <script type="text/javascript">
652 + jQuery(document).ready( function($) {
653 + $('.boilerplate-template').blur( function() {
654 + if (this.value.length == 0) {
655 + var theLi = $('li:has(#'+this.id+")");
656 + theLi.hide('normal')
657 + }
658 + } );
659 +
660 + var addRuleLi = document.createElement('li');
661 + addRuleLi.innerHTML = '<strong style="vertical-align: middle; font-size: 110%">[+]</strong> <a style="font-variant: small-caps" id="add-new-boilerplate-rule" href="#">Add new boilerplate</a> ….';
662 + $('#boilerplate-new-li').after(addRuleLi);
663 +
664 + $('#add-new-boilerplate-rule').click( function() {
665 + // Get index counter
666 + var nextIndex = parseInt($('#next-boilerplate-rule-index').val());
667 +
668 + var newIdPrefix = 'boilerplate-'+nextIndex;
669 + var newNamePrefix = 'boilerplate['+nextIndex+']';
670 +
671 + var dummy = {};
672 + dummy['li'] = {'el': $('#boilerplate-new-li') }
673 + dummy['placement'] = {'el': $('#boilerplate-new-placement') };
674 + dummy['element'] = {'el': $('#boilerplate-new-element') };
675 + dummy['template'] = {'el': $('#boilerplate-new-template') };
676 +
677 + for (var element in dummy) {
678 + dummy[element]['save'] = {
679 + 'id': dummy[element]['el'].attr('id'),
680 + 'name': dummy[element]['el'].attr('name')
681 + };
682 + dummy[element]['el'].attr('id', newIdPrefix+'-'+element);
683 + dummy[element]['el'].attr('name', newNamePrefix+'['+element+']');
684 + }
685 +
686 + var newLi = $('#'+newIdPrefix+'-li').clone(/*events=*/ true);
687 + //newLi.attr('id', null);
688 + newLi.removeClass('hide-if-js');
689 + newLi.addClass('boilerplate-li');
690 + newLi.css('display', 'none');
691 +
692 + // Switch back
693 + for (var element in dummy) {
694 + dummy[element]['el'].attr('id', dummy[element]['save']['id']);
695 + dummy[element]['el'].attr('name', dummy[element]['save']['name']);
696 + }
697 +
698 + $('#boilerplate-new-li').before(newLi);
699 + newLi.show('normal');
700 +
701 + $('#next-boilerplate-rule-index').val(nextIndex+1);
702 +
703 + return false;
704 + } )
705 + } );
706 + </script>
562 707 <?php
563 - fwp_do_meta_boxes($postsPage->meta_box_context(), $postsPage->meta_box_context(), $postsPage);
708 + if ($page->for_default_settings()) :
564 709 ?>
565 - </div> <!-- class="metabox-holder" -->
566 -</div> <!-- id="post-body" -->
710 + <h3>Advanced Settings</h3>
711 + <table class="edit-form narrow">
712 + <tbody>
713 + <tr><th scope="row"><?php _e("Hook Order:") ?></th>
714 + <td><input type="number" name="boilerplate_hook_order" value="<?php print esc_attr($hookOrder); ?>" /></td></tr>
715 + </tbody>
716 + </table>
567 717 <?php
568 - $postsPage->close_sheet();
569 -} /* function fwp_posts_page () */
718 + endif;
719 + } /* FeedWordPressPostsPage::boilerplate_box() */
570 720
571 - fwp_posts_page();
721 + function display () {
722 + $this->boxes_by_methods = array(
723 + 'publication_box' => __('Syndicated Posts'),
724 + 'links_box' => __('Links'),
725 + 'formatting_box' => __('Formatting'),
726 + 'boilerplate_box' => ('Boilerplate / Credits'),
727 + 'comments_and_pings_box' => __('Comments & Pings'),
728 + 'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
729 + 'custom_post_types_box' => ('Custom Post Types (advanced database settings)'),
730 + );
731 +
732 + parent::display();
733 + } /* FeedWordPressPostsPage::display () */
734 +
735 +
736 +}
737 +
738 + $postsPage = new FeedWordPressPostsPage;
739 + $postsPage->display();
572 740