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
feedwordpress / admin-ui.php

admin-ui.php in FeedWordPress 2016.1213, at admin-ui.php

1,286 lines 40.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 class FeedWordPressAdminPage {
3 protected $context;
4 protected $updated = false;
5 protected $mesg = NULL;
6
7 var $link = NULL;
8 var $dispatch = NULL;
9 var $filename = NULL;
10 var $pagenames = array();
11
12 /**
13 * Construct the admin page object.
14 *
15 * @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings
16 */
17 public function __construct( $page = 'feedwordpressadmin', $link = NULL ) {
18 $this->link = $link;
19
20 // Set meta-box context name
21 $this->context = $page;
22 if ($this->for_feed_settings()) :
23 $this->context .= 'forfeed';
24 endif;
25 } /* FeedWordPressAdminPage constructor */
26
27 public function pageslug () {
28 $slug = preg_replace('/FeedWordPress(.*)Page/', '$1', get_class($this));
29 return strtolower($slug);
30 }
31
32 public function pagename ($context = NULL) {
33 if (is_null($context)) :
34 $context = 'default';
35 endif;
36
37 if (isset($this->pagenames[$context])) :
38 $name = $this->pagenames[$context];
39 elseif (isset($tis->pagenames['default'])) :
40 $name = $this->pagenames['default'];
41 else :
42 $name = $this->pageslug();
43 endif;
44 return __($name);
45 } /* FeedWordPressAdminPage::pagename () */
46
47 public function accept_POST ($post) {
48 if ($this->for_feed_settings() and $this->update_requested_in($post)) :
49 $this->update_feed();
50 elseif ($this->save_requested_in($post)) : // User mashed Save Changes
51 $this->save_settings($post);
52 endif;
53 do_action($this->dispatch.'_post', $post, $this);
54 }
55
56 public function update_feed () {
57 global $feedwordpress;
58
59 add_action('feedwordpress_check_feed', 'update_feeds_mention');
60 add_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
61
62 $link = $this->link;
63
64 print '<div class="updated">';
65 print "<ul>";
66 $uri = $this->link->uri();
67 $displayUrl = $uri;
68
69 // check for effects of an effective-url filter
70 $effectiveUrl = $link->uri(array('fetch' => true));
71 if ($uri != $effectiveUrl) : $displayUrl .= ' | ' . $effectiveUrl; endif;
72
73 $delta = $feedwordpress->update($uri);
74 print "</ul>";
75
76 if (!is_null($delta)) :
77 echo "<p><strong>Update complete.</strong>".fwp_update_set_results_message($delta)."</p>";
78 echo "\n"; flush();
79 else :
80 $effectiveUrl = esc_html($effectiveUrl);
81 echo "<p><strong>Error:</strong> There was a problem updating <a href=\"$effectiveUrl\">$displayUrl</a></p>\n";
82 endif;
83 print "</div>\n";
84 remove_action('feedwordpress_check_feed', 'update_feeds_mention');
85 remove_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
86 }
87
88 public function save_settings ($post) {
89 do_action($this->dispatch.'_save', $post, $this);
90
91 if ($this->for_feed_settings()) :
92 // Save settings
93 $this->link->save_settings(/*reload=*/ true);
94 $this->updated = true;
95
96 // Reset, reload
97 $link_id = $this->link->id;
98 unset($this->link);
99 $this->link = new SyndicatedLink($link_id);
100 else :
101 $this->updated = true;
102 endif;
103 } /* FeedWordPressAdminPage::save_settings () */
104
105 public function for_feed_settings () { return (is_object($this->link) and method_exists($this->link, 'found') and $this->link->found()); }
106 public function for_default_settings () { return !$this->for_feed_settings(); }
107
108 public function setting ($names, $fallback_value = NULL, $params = array()) {
109 if (!is_array($params)) :
110 $params = array('default' => $params);
111 endif;
112 $params = shortcode_atts(array(
113 'default' => 'default',
114 'fallback' => true,
115 ), $params);
116
117 if (is_string($names)) :
118 $feed_name = $names;
119 $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
120 else :
121 $feed_name = $names['feed'];
122 $global_name = 'feedwordpress_'.$names['global'];
123 endif;
124
125 if ($this->for_feed_settings()) : // Check feed-specific setting first; fall back to global
126 if (!$params['fallback']) : $global_name = NULL; endif;
127 $ret = $this->link->setting($feed_name, $global_name, $fallback_value, $params['default']);
128 else : // Check global setting
129 $ret = get_option($global_name, $fallback_value);
130 endif;
131 return $ret;
132 }
133
134 public function update_setting ($names, $value, $default = 'default') {
135 if (is_string($names)) :
136 $feed_name = $names;
137 $global_name = 'feedwordpress_'.preg_replace('![\s/]+!', '_', $names);
138 else :
139 $feed_name = $names['feed'];
140 $global_name = 'feedwordpress_'.$names['global'];
141 endif;
142
143 if ($this->for_feed_settings()) : // Update feed-specific setting
144 $this->link->update_setting($feed_name, $value, $default);
145 else : // Update global setting
146 update_option($global_name, $value);
147 endif;
148 } /* FeedWordPressAdminPage::update_setting () */
149
150 public function save_requested_in ($post) {
151 return (isset($post['save']) or isset($post['submit']));
152 }
153 public function update_requested_in ($post) {
154 return (isset($post['update']) and (strlen($post['update']) > 0));
155 }
156
157 public function submitted_link_id () {
158 global $fwp_post;
159
160 // Presume global unless we get a specific link ID
161 $link_id = NULL;
162
163 $submit_buttons = array(
164 'save',
165 'submit',
166 'fix_mismatch',
167 'feedfinder',
168 );
169 foreach ($submit_buttons as $field) :
170 if (isset($fwp_post[$field])) :
171 $link_id = MyPHP::request('save_link_id');
172 endif;
173 endforeach;
174
175 if (is_null($link_id) and isset($_REQUEST['link_id'])) :
176 $link_id = MyPHP::request('link_id');
177 endif;
178
179 return $link_id;
180 } /* FeedWordPressAdminPage::submitted_link_id() */
181
182 public function submitted_link () {
183 $link_id = $this->submitted_link_id();
184 if (is_numeric($link_id) and $link_id) :
185 $link = new SyndicatedLink($link_id);
186 else :
187 $link = NULL;
188 endif;
189 return $link;
190 } /* FeedWordPressAdminPage::submitted_link () */
191
192 public function stamp_link_id ($field = null) {
193 if (is_null($field)) : $field = 'save_link_id'; endif;
194 ?>
195 <input type="hidden" name="<?php print esc_attr($field); ?>" value="<?php print ($this->for_feed_settings() ? $this->link->id : '*'); ?>" />
196 <?php
197 } /* FeedWordPressAdminPage::stamp_link_id () */
198
199 public function these_posts_phrase () {
200 if ($this->for_feed_settings()) :
201 $phrase = __('posts from this feed');
202 else :
203 $phrase = __('syndicated posts');
204 endif;
205 return $phrase;
206 } /* FeedWordPressAdminPage::these_posts_phrase() */
207
208 /**
209 * Provides a uniquely identifying name for the interface context for
210 * use with add_meta_box() and do_meta_boxes(),
211 *
212 * @return string the context name
213 *
214 * @see add_meta_box()
215 * @see do_meta_boxes()
216 */
217 public function meta_box_context () {
218 return $this->context;
219 } /* FeedWordPressAdminPage::meta_box_context () */
220
221 /**
222 * Outputs JavaScript to fix AJAX toggles settings.
223 *
224 * @uses FeedWordPressAdminPage::meta_box_context()
225 */
226 public function fix_toggles () {
227 FeedWordPressSettingsUI::fix_toggles_js($this->meta_box_context());
228 } /* FeedWordPressAdminPage::fix_toggles() */
229
230 public function ajax_interface_js () {
231 ?>
232 function contextual_appearance (item, appear, disappear, value, visibleStyle, checkbox) {
233 if (typeof(visibleStyle)=='undefined') visibleStyle = 'block';
234
235 var rollup=document.getElementById(item);
236 if (rollup) {
237 if ((checkbox && rollup.checked) || (!checkbox && value==rollup.value)) {
238 jQuery('#'+disappear).hide();
239 jQuery('#'+appear).show(600);
240 } else {
241 jQuery('#'+appear).hide();
242 jQuery('#'+disappear).show(600);
243 }
244 }
245 }
246 <?php
247 } /* FeedWordPressAdminPage::ajax_interface_js () */
248
249 public function admin_page_href ($page, $params = array(), $link = NULL) {
250 global $fwp_path;
251
252 // Merge in the page's filename
253 $params = array_merge($params, array('page' => $fwp_path.'/'.$page));
254
255 // If there is a link ID provided, then merge that in too.
256 if (!is_null($link)) :
257 $link_id = NULL;
258 if (is_object($link)) :
259 if (method_exists($link, 'found')) :
260 // Is this a SyndicatedLink object?
261 if ($link->found()) :
262 $link_id = $link->link->link_id;
263 endif;
264 else :
265 // Is this a wp_links table record?
266 $link_id = $link->link_id;
267 endif;
268 else :
269 // Is this just a numeric ID?
270 $link_id = $link;
271 endif;
272
273 if (!is_null($link_id)) :
274 $params = array_merge($params, array('link_id' => $link_id));
275 endif;
276 endif;
277
278 return MyPHP::url(admin_url('admin.php'), $params);
279 } /* FeedWordPressAdminPage::admin_page_href () */
280
281 public function display_feed_settings_page_links ($params = array()) {
282 global $fwp_path;
283
284 $params = wp_parse_args($params, array(
285 'before' => '',
286 'between' => ' | ',
287 'after' => '',
288 'long' => false,
289 'subscription' => $this->link,
290 ));
291 $sub = $params['subscription'];
292
293 $links = array(
294 "Feed" => array('page' => 'feeds-page.php', 'long' => 'Feeds & Updates'),
295 "Posts" => array('page' => 'posts-page.php', 'long' => 'Posts & Links'),
296 "Authors" => array('page' => 'authors-page.php', 'long' => 'Authors'),
297 'Categories' => array('page' => 'categories-page.php', 'long' => 'Categories & Tags'),
298 );
299
300 $link_id = NULL;
301 if (is_object($sub)) :
302 if (method_exists($sub, 'found')) :
303 if ($sub->found()) :
304 $link_id = $sub->link->link_id;
305 endif;
306 else :
307 $link_id = $sub->link_id;
308 endif;
309 endif;
310
311 print $params['before']; $first = true;
312 foreach ($links as $label => $link) :
313 if (!$first) : print $params['between']; endif;
314
315 if (isset($link['url'])) : MyPHP::url($link['url'], array("link_id" => $link_id));
316 else : $url = $this->admin_page_href($link['page'], array(), $sub);
317 endif;
318 $url = esc_html($url);
319
320 if ($link['page']==basename($this->filename)) :
321 print "<strong>";
322 else :
323 print "<a href=\"${url}\">";
324 endif;
325
326 if ($params['long']) : print esc_html(__($link['long']));
327 else : print esc_html(__($label));
328 endif;
329
330 if ($link['page']==basename($this->filename)) :
331 print "</strong>";
332 else :
333 print "</a>";
334 endif;
335
336 $first = false;
337 endforeach;
338 print $params['after'];
339 } /* FeedWordPressAdminPage::display_feed_settings_page_links */
340
341 public function display_feed_select_dropdown() {
342 $links = FeedWordPress::syndicated_links();
343
344 ?>
345 <div id="fwpfs-container"><ul class="subsubsub">
346 <li><select name="link_id" class="fwpfs" style="max-width: 20.0em;">
347 <option value="*"<?php if ($this->for_default_settings()) : ?> selected="selected"<?php endif; ?>>- defaults for all feeds -</option>
348 <?php if ($links) : foreach ($links as $ddlink) : ?>
349 <option value="<?php print (int) $ddlink->link_id; ?>"<?php if (!is_null($this->link) and ($this->link->id==$ddlink->link_id)) : ?> selected="selected"<?php endif; ?>><?php print esc_html($ddlink->link_name); ?></option>
350 <?php endforeach; endif; ?>
351 </select>
352 <input id="fwpfs-button" class="button" type="submit" name="go" value="<?php _e('Go') ?> &raquo;" /></li>
353
354 <?php
355 $this->display_feed_settings_page_links(array(
356 'before' => '<li>',
357 'between' => "</li>\n<li>",
358 'after' => '</li>',
359 'subscription' => $this->link,
360 ));
361
362 if ($this->for_feed_settings()) :
363 ?>
364 <li><input class="button" type="submit" name="update" value="Update Now" /></li>
365 <?php
366 endif;
367 ?>
368 </ul>
369 </div>
370 <?php
371 } /* FeedWordPressAdminPage::display_feed_select_dropdown() */
372
373 public function display_sheet_header ($pagename = 'Syndication', $all = false) {
374 global $fwp_path;
375 ?>
376 <div class="icon32"><img src="<?php print esc_html( plugins_url( '/'.$fwp_path.'/feedwordpress.png') ); ?>" alt="" /></div>
377 <h2><?php print esc_html(__($pagename.($all ? '' : ' Settings'))); ?><?php if ($this->for_feed_settings()) : ?>: <?php echo esc_html($this->link->name(/*from feed=*/ false)); ?><?php endif; ?></h2>
378 <?php
379 }
380
381 public function display_update_notice_if_updated ($pagename = 'Syndication', $mesg = NULL) {
382 if (!is_null($mesg)) :
383 $this->mesg = $mesg;
384 endif;
385
386 if ($this->updated) :
387 if ($this->updated === true) :
388 $this->mesg = $pagename . ' settings updated.';
389 else :
390 $this->mesg = $this->updated;
391 endif;
392 endif;
393
394 if (!is_null($this->mesg)) :
395 ?>
396 <div class="updated">
397 <p><?php print esc_html($this->mesg); ?></p>
398 </div>
399 <?php
400 endif;
401 } /* FeedWordPressAdminPage::display_update_notice_if_updated() */
402
403 public function display_settings_scope_message () {
404 if ($this->for_feed_settings()) :
405 ?>
406 <p>These settings only affect posts syndicated from
407 <strong><?php echo esc_html($this->link->link->link_name); ?></strong>.</p>
408 <?php
409 else :
410 ?>
411 <p>These settings affect posts syndicated from any feed unless they are overridden
412 by settings for that specific feed.</p>
413 <?php
414 endif;
415 } /* FeedWordPressAdminPage::display_settings_scope_message () */
416
417 /*static*/ function has_link () { return true; }
418
419 public function form_action ($filename = NULL) {
420 global $fwp_path;
421
422 if (is_null($filename)) :
423 $filename = basename($this->filename);
424 endif;
425 return $this->admin_page_href($filename);
426 } /* FeedWordPressAdminPage::form_action () */
427
428 public function update_message () {
429 return $this->mesg;
430 }
431
432 public function display () {
433 global $fwp_post;
434
435 if (FeedWordPress::needs_upgrade()) :
436 fwp_upgrade_page();
437 return;
438 endif;
439
440 FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
441
442 ////////////////////////////////////////////////
443 // Process POST request, if any ////////////////
444 ////////////////////////////////////////////////
445 if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
446 $this->accept_POST($fwp_post);
447 else :
448 $this->updated = false;
449 endif;
450
451 ////////////////////////////////////////////////
452 // Prepare settings page ///////////////////////
453 ////////////////////////////////////////////////
454
455 $this->display_update_notice_if_updated(
456 $this->pagename('settings-update'),
457 $this->update_message()
458 );
459
460 $this->open_sheet($this->pagename('open-sheet'));
461 ?>
462 <div id="post-body">
463 <?php
464 foreach ($this->boxes_by_methods as $method => $row) :
465 if (is_array($row)) :
466 $id = $row['id'];
467 $title = $row['title'];
468 else :
469 $id = 'feedwordpress_'.$method;
470 $title = $row;
471 endif;
472
473 add_meta_box(
474 /*id=*/ $id,
475 /*title=*/ $title,
476 /*callback=*/ array($this, $method),
477 /*page=*/ $this->meta_box_context(),
478 /*context=*/ $this->meta_box_context()
479 );
480 endforeach;
481 do_action($this->dispatch.'_meta_boxes', $this);
482 ?>
483 <div class="metabox-holder">
484 <?php
485 fwp_do_meta_boxes($this->meta_box_context(), $this->meta_box_context(), $this);
486 ?>
487 </div> <!-- class="metabox-holder" -->
488 </div> <!-- id="post-body" -->
489 <?php $this->close_sheet(); ?>
490 <?php
491 }
492
493 public function open_sheet ($header) {
494 // Set up prepatory AJAX stuff
495 ?>
496 <script type="text/javascript">
497 <?php
498 $this->ajax_interface_js();
499 ?>
500 </script>
501
502 <?php
503 add_action(
504 FeedWordPressCompatibility::bottom_script_hook($this->filename),
505 /*callback=*/ array($this, 'fix_toggles'),
506 /*priority=*/ 10000
507 );
508 FeedWordPressSettingsUI::ajax_nonce_fields();
509
510 ?>
511 <div class="wrap feedwordpress-admin" id="feedwordpress-admin-<?php print $this->pageslug(); ?>">
512 <?php
513 if (!is_null($header)) :
514 $this->display_sheet_header($header);
515 endif;
516
517 if (!is_null($this->dispatch)) :
518 ?>
519 <form action="<?php print $this->form_action(); ?>" method="post">
520 <div><?php
521 FeedWordPressCompatibility::stamp_nonce($this->dispatch);
522 $this->stamp_link_id();
523 ?></div>
524 <?php
525 endif;
526
527 if ($this->has_link()) :
528 $this->display_settings_scope_message();
529 endif;
530
531 ?><div class="tablenav"><?php
532 if (!is_null($this->dispatch)) :
533 ?><div class="alignright"><?php
534 $this->save_button();
535 ?></div><?php
536 endif;
537
538 if ($this->has_link()) :
539 $this->display_feed_select_dropdown();
540 endif;
541 ?>
542 </div>
543
544 <div id="poststuff">
545 <?php
546 } /* FeedWordPressAdminPage::open_sheet () */
547
548 public function close_sheet () {
549 ?>
550
551 </div> <!-- id="poststuff" -->
552 <?php
553 if (!is_null($this->dispatch)) :
554 $this->save_button();
555 print "</form>\n";
556 endif;
557 ?>
558 </div> <!-- class="wrap" -->
559
560 <?php
561 } /* FeedWordPressAdminPage::close_sheet () */
562
563 public function setting_radio_control ($localName, $globalName, $options, $params = array()) {
564 global $fwp_path;
565
566 if (isset($params['filename'])) : $filename = $params['filename'];
567 else : $filename = basename($this->filename);
568 endif;
569
570 if (isset($params['site-wide-url'])) : $href = $params['site-wide-url'];
571 else : $href = $this->admin_page_href($filename);
572 endif;
573
574 if (isset($params['setting-default'])) : $settingDefault = $params['setting-default'];
575 else : $settingDefault = NULL;
576 endif;
577
578 if (isset($params['global-setting-default'])) : $globalSettingDefault = $params['global-setting-default'];
579 else : $globalSettingDefault = $settingDefault;
580 endif;
581
582 $globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
583 if ($this->for_feed_settings()) :
584 $setting = $this->link->setting($localName, NULL, $settingDefault);
585 else :
586 $setting = $globalSetting;
587 endif;
588
589 if (isset($params['offer-site-wide'])) : $offerSiteWide = $params['offer-site-wide'];
590 else : $offerSiteWide = $this->for_feed_settings();
591 endif;
592
593 // This allows us to provide an alternative set of human-readable
594 // labels for each potential value. For use in Currently: line.
595 if (isset($params['labels'])) : $labels = $params['labels'];
596 elseif (is_callable($options)) : $labels = NULL;
597 else : $labels = $options;
598 endif;
599
600 if (isset($params['input-name'])) : $inputName = $params['input-name'];
601 else : $inputName = $globalName;
602 endif;
603
604 if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
605 else : $defaultInputId = NULL;
606 endif;
607
608 if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
609 elseif (!is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
610 else : $defaultInputIdNo = NULL;
611 endif;
612
613 // This allows us to either include the site-default setting as
614 // one of the options within the radio box, or else as a simple
615 // yes/no toggle that controls whether or not to check another
616 // set of inputs.
617 if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
618 else : $defaultInputName = $inputName;
619 endif;
620
621 if ($defaultInputName != $inputName) :
622 $defaultInputValue = 'yes';
623 else :
624 $defaultInputValue = (
625 isset($params['default-input-value'])
626 ? $params['default-input-value']
627 : 'site-default'
628 );
629 endif;
630
631 $settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
632
633 if (!is_callable($options)) :
634 $checked = array();
635 if ($settingDefaulted) :
636 $checked[$defaultInputValue] = ' checked="checked"';
637 endif;
638
639 foreach ($options as $value => $label) :
640 if ($setting == $value) :
641 $checked[$value] = ' checked="checked"';
642 else :
643 $checked[$value] = '';
644 endif;
645 endforeach;
646 endif;
647
648 $defaulted = array();
649 if ($defaultInputName != $inputName) :
650 $defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
651 $defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
652 else :
653 $defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
654 endif;
655
656 if (isset($params['defaulted'])) :
657 $defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
658 $defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
659 endif;
660
661 if ($offerSiteWide) :
662 ?>
663 <table class="twofer">
664 <tbody>
665 <tr><td class="equals first inactive">
666 <ul class="options">
667 <li><label><input type="radio"
668 name="<?php print $defaultInputName; ?>"
669 value="<?php print $defaultInputValue; ?>"
670 <?php if (!is_null($defaultInputId)) : ?>id="<?php print $defaultInputId; ?>" <?php endif; ?>
671 <?php print $defaulted['yes']; ?> />
672 Use the site-wide setting</label>
673 <span class="current-setting">Currently:
674 <strong><?php if (is_callable($labels)) :
675 print call_user_func($labels, $globalSetting, $defaulted, $params);
676 elseif (is_null($labels)) :
677 print $globalSetting;
678 else :
679 print $labels[$globalSetting];
680 endif; ?></strong> (<a href="<?php print $href; ?>">change</a>)</span></li>
681 </ul></td>
682
683 <td class="equals second inactive">
684 <?php if ($defaultInputName != $inputName) : ?>
685 <ul class="options">
686 <li><label><input type="radio"
687 name="<?php print $defaultInputName; ?>"
688 value="no"
689 <?php if (!is_null($defaultInputIdNo)) : ?>id="<?php print $defaultInputIdNo; ?>" <?php endif; ?>
690 <?php print $defaulted['no']; ?> />
691 <?php _e('Do something different with this feed.'); ?></label>
692 <?php endif;
693 endif;
694
695 // Let's spit out the controls here.
696 if (is_callable($options)) :
697 // Method call to print out options list
698 call_user_func($options, $setting, $defaulted, $params);
699 else :
700 ?>
701 <ul class="options">
702 <?php foreach ($options as $value => $label) : ?>
703 <li><label><input type="radio" name="<?php print $inputName; ?>"
704 value="<?php print $value; ?>"
705 <?php print $checked[$value]; ?> />
706 <?php print $label; ?></label></li>
707 <?php endforeach; ?>
708 </ul> <!-- class="options" -->
709 <?php
710 endif;
711
712 if ($offerSiteWide) :
713 if ($defaultInputName != $inputName) :
714 // Close the <li> and <ul class="options"> we opened above
715 ?>
716 </li>
717 </ul> <!-- class="options" -->
718 <?php
719 endif;
720
721 // Close off the twofer table that we opened up above.
722 ?>
723 </td></tr>
724 </tbody>
725 </table>
726 <?php
727 endif;
728 } /* FeedWordPressAdminPage::setting_radio_control () */
729
730 public function save_button ($caption = NULL) {
731 if (is_null($caption)) : $caption = __('Save Changes'); endif;
732 ?>
733 <p class="submit">
734 <input class="button-primary" type="submit" name="save" value="<?php print $caption; ?>" />
735 </p>
736 <?php
737 }
738 } /* class FeedWordPressAdminPage */
739
740 function fwp_update_set_results_message ($delta, $joiner = ';') {
741 $mesg = array();
742 if (isset($delta['new'])) : $mesg[] = ' '.$delta['new'].' new posts were syndicated'; endif;
743 if (isset($delta['updated']) and ($delta['updated'] != 0)) : $mesg[] = ' '.$delta['updated'].' existing posts were updated'; endif;
744 if (isset($delta['stored']) and ($delta['stored'] != 0)) : $mesg[] = ' '.$delta['stored'].' alternate versions of existing posts were stored for reference'; endif;
745
746 if (!is_null($joiner)) :
747 $mesg = implode($joiner, $mesg);
748 endif;
749 return $mesg;
750 } /* function fwp_update_set_results_message () */
751
752 function fwp_authors_single_submit ($link = NULL) {
753 ?>
754 <div class="submitbox" id="submitlink">
755 <div id="previewview">
756 </div>
757 <div class="inside">
758 </div>
759
760 <p class="submit">
761 <input type="submit" name="save" value="<?php _e('Save') ?>" />
762 </p>
763 </div>
764 <?php
765 }
766
767 function fwp_option_box_opener ($legend, $id, $class = "stuffbox") {
768 ?>
769 <div id="<?php print $id; ?>" class="<?php print $class; ?>">
770 <h3><?php print htmlspecialchars($legend); ?></h3>
771 <div class="inside">
772 <?php
773 }
774
775 function fwp_option_box_closer () {
776 ?>
777 </div> <!-- class="inside" -->
778 </div> <!-- class="stuffbox" -->
779 <?php
780 }
781
782 function fwp_tags_box ($tags, $object, $params = array()) {
783 $params = wp_parse_args($params, array( // Default values
784 'taxonomy' => 'post_tag',
785 'textarea_name' => NULL,
786 'textarea_id' => NULL,
787 'input_id' => NULL,
788 'input_name' => NULL,
789 'id' => NULL,
790 'box_title' => __('Post Tags'),
791 ));
792
793 if (!is_array($tags)) : $tags = array(); endif;
794
795 $tax_name = $params['taxonomy'];
796
797 $oTax = get_taxonomy($params['taxonomy']);
798 $oTaxLabels = get_taxonomy_labels($oTax);
799
800 $disabled = (!current_user_can($oTax->cap->assign_terms) ? 'disabled="disabled"' : '');
801
802 $desc = "<p style=\"font-size:smaller;font-style:bold;margin:0\">Tag $object as...</p>";
803
804 if (is_null($params['textarea_name'])) :
805 $params['textarea_name'] = "tax_input[$tax_name]";
806 endif;
807 if (is_null($params['textarea_id'])) :
808 $params['textarea_id'] = "tax-input-${tax_name}";
809 endif;
810 if (is_null($params['input_id'])) :
811 $params['input_id'] = "new-tag-${tax_name}";
812 endif;
813 if (is_null($params['input_name'])) :
814 $params['input_name'] = "newtag[$tax_name]";
815 endif;
816
817 if (is_null($params['id'])) :
818 $params['id'] = $tax_name;
819 endif;
820
821 print $desc;
822 $helps = __('Separate tags with commas.');
823 $box['title'] = __('Tags');
824 ?>
825 <div class="tagsdiv" id="<?php echo $params['id']; ?>">
826 <div class="jaxtag">
827 <div class="nojs-tags hide-if-js">
828 <p><?php echo $oTaxLabels->add_or_remove_items; ?></p>
829 <textarea name="<?php echo $params['textarea_name']; ?>" class="the-tags" id="<?php echo $params['textarea_id']; ?>"><?php echo esc_attr(implode(",", $tags)); ?></textarea></div>
830
831 <?php if ( current_user_can($oTax->cap->assign_terms) ) :?>
832 <div class="ajaxtag hide-if-no-js">
833 <label class="screen-reader-text" for="<?php echo $params['input_id']; ?>"><?php echo $params['box_title']; ?></label>
834 <div class="taghint"><?php echo $oTaxLabels->add_new_item; ?></div>
835 <p><input type="text" id="<?php print $params['input_id']; ?>" name="<?php print $params['input_name']; ?>" class="newtag form-input-tip" size="16" autocomplete="off" value="" />
836 <input type="button" class="button tagadd" value="<?php esc_attr_e('Add'); ?>" tabindex="3" /></p>
837 </div>
838 <p class="howto"><?php echo esc_attr( $oTaxLabels->separate_items_with_commas ); ?></p>
839 <?php endif; ?>
840 </div>
841
842 <div class="tagchecklist"></div>
843 </div>
844 <?php if ( current_user_can($oTax->cap->assign_terms) ) : ?>
845 <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $oTaxLabels->choose_from_most_used; ?></a></p>
846 <?php endif;
847
848 }
849
850 function fwp_category_box ($checked, $object, $tags = array(), $params = array()) {
851 global $wp_db_version;
852
853 if (is_string($params)) :
854 $prefix = $params;
855 $taxonomy = 'category';
856 elseif (is_array($params)) :
857 $prefix = (isset($params['prefix']) ? $params['prefix'] : '');
858 $taxonomy = (isset($params['taxonomy']) ? $params['taxonomy'] : 'category');
859 endif;
860
861 $oTax = get_taxonomy($taxonomy);
862 $oTaxLabels = get_taxonomy_labels($oTax);
863
864 if (strlen($prefix) > 0) :
865 $idPrefix = $prefix.'-';
866 $idSuffix = "-".$prefix;
867 $namePrefix = $prefix . '_';
868 else :
869 $idPrefix = 'feedwordpress-';
870 $idSuffix = "-feedwordpress";
871 $namePrefix = 'feedwordpress_';
872 endif;
873
874 ?>
875 <div id="<?php print $idPrefix; ?>taxonomy-<?php print $taxonomy; ?>" class="feedwordpress-category-div">
876 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-tabs" class="category-tabs">
877 <li class="ui-tabs-selected tabs"><a href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" tabindex="3"><?php _e( 'All posts' ); ?></a>
878 <p style="font-size:smaller;font-style:bold;margin:0">Give <?php print $object; ?> these <?php print $oTaxLabels->name; ?></p>
879 </li>
880 </ul>
881
882 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-all" class="tabs-panel">
883 <input type="hidden" value="0" name="tax_input[<?php print $taxonomy; ?>][]" />
884 <ul id="<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist" class="list:<?php print $taxonomy; ?> categorychecklist form-no-clear">
885 <?php fwp_category_checklist(NULL, false, $checked, $params) ?>
886 </ul>
887 </div>
888
889 <div id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-adder" class="<?php print $taxonomy; ?>-adder wp-hidden-children">
890 <h4><a id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-toggle" class="category-add-toggle" href="#<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="hide-if-no-js" tabindex="3"><?php _e( '+ Add New Category' ); ?></a></h4>
891 <p id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add" class="category-add wp-hidden-child">
892 <?php
893 $newcat = 'new'.$taxonomy;
894
895 ?>
896 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"><?php _e('Add New Category'); ?></label>
897 <input
898 id="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>"
899 class="new<?php print $taxonomy; ?> form-required form-input-tip"
900 aria-required="true"
901 tabindex="3"
902 type="text" name="<?php print $newcat; ?>"
903 value="<?php _e( 'New category name' ); ?>"
904 />
905 <label class="screen-reader-text" for="<?php print $idPrefix; ?>new<?php print $taxonomy; ?>-parent"><?php _e('Parent Category:'); ?></label>
906 <?php wp_dropdown_categories( array(
907 'taxonomy' => $taxonomy,
908 'hide_empty' => 0,
909 'id' => $idPrefix.'new'.$taxonomy.'-parent',
910 'class' => 'new'.$taxonomy.'-parent',
911 'name' => $newcat.'_parent',
912 'orderby' => 'name',
913 'hierarchical' => 1,
914 'show_option_none' => __('Parent category'),
915 'tab_index' => 3,
916 ) ); ?>
917 <input type="button" id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-add-sumbit" class="add:<?php print $idPrefix; ?><?php print $taxonomy; ?>checklist:<?php print $idPrefix.$taxonomy; ?>-add add-categorychecklist-category-add button category-add-submit" value="<?php _e( 'Add' ); ?>" tabindex="3" />
918 <?php /* wp_nonce_field currently doesn't let us set an id different from name, but we need a non-unique name and a unique id */ ?>
919 <input type="hidden" id="_ajax_nonce<?php print esc_html($idSuffix); ?>" name="_ajax_nonce" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
920 <input type="hidden" id="_ajax_nonce-add-<?php print $taxonomy; ?><?php print esc_html($idSuffix); ?>" name="_ajax_nonce-add-<?php print $taxonomy; ?>" value="<?php print wp_create_nonce('add-'.$taxonomy); ?>" />
921 <span id="<?php print $idPrefix; ?><?php print $taxonomy; ?>-ajax-response" class="<?php print $taxonomy; ?>-ajax-response"></span>
922 </p>
923 </div>
924
925 </div>
926 <?php
927 }
928
929 function update_feeds_mention ($feed) {
930 echo "<li>Updating <cite>".$feed['link/name']."</cite> from &lt;<a href=\""
931 .$feed['link/uri']."\">".$feed['link/uri']."</a>&gt; ...";
932 flush();
933 }
934 function update_feeds_finish ($feed, $added, $dt) {
935 if (is_wp_error($added)) :
936 $mesgs = $added->get_error_messages();
937 foreach ($mesgs as $mesg) :
938 echo "<br/><strong>Feed error:</strong> <code>$mesg</code>";
939 endforeach;
940 echo "</li>\n";
941 else :
942 echo " completed in $dt second".(($dt==1)?'':'s')."</li>\n";
943 endif;
944 flush();
945 }
946
947 function fwp_author_list () {
948 global $wpdb;
949 $ret = array();
950
951 $users = get_users();
952 if (is_array($users)) :
953 foreach ($users as $user) :
954 $id = (int) $user->ID;
955 $ret[$id] = $user->display_name;
956 if (strlen(trim($ret[$id])) == 0) :
957 $ret[$id] = $user->user_login;
958 endif;
959 endforeach;
960 endif;
961 return $ret;
962 }
963
964 class FeedWordPressSettingsUI {
965 static function is_admin () {
966 global $fwp_path;
967
968 $admin_page = false; // Innocent until proven guilty
969 if (isset($_REQUEST['page'])) :
970 $admin_page = (
971 is_admin()
972 and preg_match("|^{$fwp_path}/|", $_REQUEST['page'])
973 );
974 endif;
975 return $admin_page;
976 }
977
978 static function admin_scripts () {
979 global $fwp_path;
980
981 wp_enqueue_script('post'); // for magic tag and category boxes
982 wp_enqueue_script('admin-forms'); // for checkbox selection
983
984 wp_register_script('feedwordpress-elements', plugins_url('/' . $fwp_path . '/feedwordpress-elements.js') );
985 wp_enqueue_script('feedwordpress-elements');
986 }
987
988 static function admin_styles () {
989 ?>
990 <style type="text/css">
991 #feedwordpress-admin-feeds .link-rss-params-remove .x, .feedwordpress-admin .remove-it .x {
992 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll 0 0 transparent;
993 }
994
995 #feedwordpress-admin-feeds .link-rss-params-remove:hover .x, .feedwordpress-admin .remove-it:hover .x {
996 background: url(<?php print admin_url('images/xit.gif') ?>) no-repeat scroll -10px 0 transparent;
997 }
998
999 .fwpfs {
1000 background-image: url(<?php print admin_url('images/fav.png'); ?>);
1001 background-repeat: repeat-x;
1002 background-position: left center;
1003 background-attachment: scroll;
1004 }
1005 .fwpfs.slide-down {
1006 background-image:url(<?php print admin_url('images/fav-top.png'); ?>);
1007 background-position:0 top;
1008 background-repeat:repeat-x;
1009 }
1010
1011 .update-results {
1012 max-width: 100%;
1013 overflow: auto;
1014 }
1015
1016 </style>
1017 <?php
1018 } /* FeedWordPressSettingsUI::admin_styles () */
1019
1020 static function ajax_nonce_fields () {
1021 if (function_exists('wp_nonce_field')) :
1022 echo "<form style='display: none' method='get' action=''>\n<p>\n";
1023 wp_nonce_field( 'closedpostboxes', 'closedpostboxesnonce', false );
1024 wp_nonce_field( 'meta-box-order', 'meta-box-order-nonce', false );
1025 echo "</p>\n</form>\n";
1026 endif;
1027 } /* FeedWordPressSettingsUI::ajax_nonce_fields () */
1028
1029 static function fix_toggles_js ($context) {
1030 ?>
1031 <script type="text/javascript">
1032 jQuery(document).ready( function($) {
1033 // In case someone got here first...
1034 $('.postbox h3, .postbox .handlediv').unbind('click');
1035 $('.postbox h3 a').unbind('click');
1036 $('.hide-postbox-tog').unbind('click');
1037 $('.columns-prefs input[type="radio"]').unbind('click');
1038 $('.meta-box-sortables').sortable('destroy');
1039
1040 postboxes.add_postbox_toggles('<?php print $context; ?>');
1041 } );
1042 </script>
1043 <?php
1044 } /* FeedWordPressSettingsUI::fix_toggles_js () */
1045
1046 static function magic_input_tip_js ($id) {
1047 if (!preg_match('/^[.#]/', $id)) :
1048 $id = '#'.$id;
1049 endif;
1050 ?>
1051 <script type="text/javascript">
1052 jQuery(document).ready( function () {
1053 var inputBox = jQuery("<?php print $id; ?>");
1054 var boxEl = inputBox.get(0);
1055 if (boxEl.value==boxEl.defaultValue) { inputBox.addClass('form-input-tip'); }
1056 inputBox.focus(function() {
1057 if ( this.value == this.defaultValue )
1058 jQuery(this).val( '' ).removeClass( 'form-input-tip' );
1059 });
1060 inputBox.blur(function() {
1061 if ( this.value == '' )
1062 jQuery(this).val( this.defaultValue ).addClass( 'form-input-tip' );
1063 });
1064 } );
1065 </script>
1066 <?php
1067 } /* FeedWordPressSettingsUI::magic_input_tip_js () */
1068 } /* class FeedWordPressSettingsUI */
1069
1070 function fwp_insert_new_user ($newuser_name) {
1071 global $wpdb;
1072
1073 $ret = null;
1074 if (strlen($newuser_name) > 0) :
1075 $userdata = array();
1076 $userdata['ID'] = NULL;
1077 $userdata['user_login'] = apply_filters('pre_user_login', sanitize_user($newuser_name));
1078 $userdata['user_nicename'] = apply_filters('pre_user_nicename', sanitize_title($newuser_name));
1079 $userdata['display_name'] = $newuser_name;
1080 $userdata['user_pass'] = substr(md5(uniqid(microtime())), 0, 6); // just something random to lock it up
1081
1082 $blahUrl = get_bloginfo('url'); $url = parse_url($blahUrl);
1083 $userdata['user_email'] = substr(md5(uniqid(microtime())), 0, 6).'@'.$url['host'];
1084
1085 $newuser_id = wp_insert_user($userdata);
1086 $ret = $newuser_id; // Either a numeric ID or a WP_Error object
1087 else :
1088 // TODO: Add some error reporting
1089 endif;
1090 return $ret;
1091 } /* fwp_insert_new_user () */
1092
1093 /**
1094 * fwp_add_meta_box
1095 *
1096 * This function is no longer necessary, since no versions of WordPress that FWP
1097 * still supports lack add_meta_box(). But I've left it in place for the time
1098 * being for add-on modules that may have used it in setting up their UI.
1099 */
1100 function fwp_add_meta_box ($id, $title, $callback, $page, $context = 'advanced', $priority = 'default', $callback_args = null) {
1101 return add_meta_box($id, $title, $callback, $page, $context, $priority, $callback_args);
1102 } /* function fwp_add_meta_box () */
1103
1104 function fwp_do_meta_boxes($page, $context, $object) {
1105 $ret = do_meta_boxes($page, $context, $object);
1106
1107 // Avoid JavaScript error from WordPress 2.5 bug
1108 ?>
1109 <div style="display: none">
1110 <div id="tags-input"></div> <!-- avoid JS error from WP 2.5 bug -->
1111 </div>
1112 <?php
1113 return $ret;
1114 } /* function fwp_do_meta_boxes() */
1115
1116 function fwp_remove_meta_box($id, $page, $context) {
1117 return remove_meta_box($id, $page, $context);
1118 } /* function fwp_remove_meta_box() */
1119
1120 function fwp_syndication_manage_page_links_table_rows ($links, $page, $visible = 'Y') {
1121
1122 $subscribed = ('Y' == strtoupper($visible));
1123 if ($subscribed or (count($links) > 0)) :
1124 ?>
1125 <table class="widefat<?php if (!$subscribed) : ?> unsubscribed<?php endif; ?>">
1126 <thead>
1127 <tr>
1128 <th class="check-column" scope="col"><input type="checkbox" /></th>
1129 <th scope="col"><?php _e('Name'); ?></th>
1130 <th scope="col"><?php _e('Feed'); ?></th>
1131 <th scope="col"><?php _e('Updated'); ?></th>
1132 </tr>
1133 </thead>
1134
1135 <tbody>
1136 <?php
1137 $alt_row = true;
1138 if (count($links) > 0):
1139 foreach ($links as $link):
1140 $trClass = array();
1141
1142 // Prep: Get last updated timestamp
1143 $sLink = new SyndicatedLink($link->link_id);
1144 if (!is_null($sLink->setting('update/last'))) :
1145 $lastUpdated = 'Last checked '. fwp_time_elapsed($sLink->setting('update/last'));
1146 else :
1147 $lastUpdated = __('None yet');
1148 endif;
1149
1150 // Prep: get last error timestamp, if any
1151 $fileSizeLines = array();
1152 if (is_null($sLink->setting('update/error'))) :
1153 $errorsSince = '';
1154 if (!is_null($sLink->setting('link/item count'))) :
1155 $N = $sLink->setting('link/item count');
1156 $fileSizeLines[] = sprintf((($N==1) ? __('%d item') : __('%d items')), $N);
1157 endif;
1158
1159 if (!is_null($sLink->setting('link/filesize'))) :
1160 $fileSizeLines[] = size_format($sLink->setting('link/filesize')). ' total';
1161 endif;
1162 else :
1163 $trClass[] = 'feed-error';
1164
1165 $theError = unserialize($sLink->setting('update/error'));
1166
1167 $errorsSince = "<div class=\"returning-errors\">"
1168 ."<p><strong>Returning errors</strong> since "
1169 .fwp_time_elapsed($theError['since'])
1170 ."</p>"
1171 ."<p>Most recent ("
1172 .fwp_time_elapsed($theError['ts'])
1173 ."):<br/><code>"
1174 .implode("</code><br/><code>", $theError['object']->get_error_messages())
1175 ."</code></p>"
1176 ."</div>\n";
1177 endif;
1178
1179 $nextUpdate = "<div style='max-width: 30.0em; font-size: 0.9em;'><div style='font-style:italic;'>";
1180
1181 $ttl = $sLink->setting('update/ttl');
1182 if (is_numeric($ttl)) :
1183 $next = $sLink->setting('update/last') + $sLink->setting('update/fudge') + ((int) $ttl * 60);
1184 if ('automatically'==$sLink->setting('update/timed')) :
1185 if ($next < time()) :
1186 $nextUpdate .= 'Ready and waiting to be updated since ';
1187 else :
1188 $nextUpdate .= 'Scheduled for next update ';
1189 endif;
1190 $nextUpdate .= fwp_time_elapsed($next);
1191 if (FEEDWORDPRESS_DEBUG) : $nextUpdate .= " [".(($next-time())/60)." minutes]"; endif;
1192 else :
1193 $lastUpdated .= " &middot; Next ";
1194 if ($next < time()) :
1195 $lastUpdated .= 'ASAP';
1196 elseif ($next - time() < 60) :
1197 $lastUpdated .= fwp_time_elapsed($next);
1198 elseif ($next - time() < 60*60*24) :
1199 $lastUpdated .= gmdate('g:ia', $next + (get_option('gmt_offset') * 3600));
1200 else :
1201 $lastUpdated .= gmdate('F j', $next + (get_option('gmt_offset') * 3600));
1202 endif;
1203
1204 $nextUpdate .= "Scheduled to be checked for updates every ".$ttl." minute".(($ttl!=1)?"s":"")."</div><div style='size:0.9em; margin-top: 0.5em'> This update schedule was requested by the feed provider";
1205 if ($sLink->setting('update/xml')) :
1206 $nextUpdate .= " using a standard <code style=\"font-size: inherit; padding: 0; background: transparent\">&lt;".$sLink->setting('update/xml')."&gt;</code> element";
1207 endif;
1208 $nextUpdate .= ".";
1209 endif;
1210 else:
1211 $nextUpdate .= "Scheduled for update as soon as possible";
1212 endif;
1213 $nextUpdate .= "</div></div>";
1214
1215 $fileSize = '';
1216 if (count($fileSizeLines) > 0) :
1217 $fileSize = '<div>'.implode(" / ", $fileSizeLines)."</div>";
1218 endif;
1219
1220 unset($sLink);
1221
1222 $alt_row = !$alt_row;
1223
1224 if ($alt_row) :
1225 $trClass[] = 'alternate';
1226 endif;
1227 ?>
1228 <tr<?php echo ((count($trClass) > 0) ? ' class="'.implode(" ", $trClass).'"':''); ?>>
1229 <th class="check-column" scope="row"><input type="checkbox" name="link_ids[]" value="<?php echo $link->link_id; ?>" /></th>
1230 <?php
1231 $caption = (
1232 (strlen($link->link_rss) > 0)
1233 ? __('Switch Feed')
1234 : $caption=__('Find Feed')
1235 );
1236 ?>
1237 <td>
1238 <strong><a href="<?php print $page->admin_page_href('feeds-page.php', array(), $link); ?>"><?php print esc_html($link->link_name); ?></a></strong>
1239 <div class="row-actions"><?php if ($subscribed) :
1240 $page->display_feed_settings_page_links(array(
1241 'before' => '<div><strong>Settings &gt;</strong> ',
1242 'after' => '</div>',
1243 'subscription' => $link,
1244 ));
1245 endif; ?>
1246
1247 <div><strong>Actions &gt;</strong>
1248 <?php if ($subscribed) : ?>
1249 <a href="<?php print $page->admin_page_href('syndication.php', array('action' => 'feedfinder'), $link); ?>"><?php echo $caption; ?></a>
1250 <?php else : ?>
1251 <a href="<?php print $page->admin_page_href('syndication.php', array('action' => FWP_RESUB_CHECKED), $link); ?>"><?php _e('Re-subscribe'); ?></a>
1252 <?php endif; ?>
1253 | <a href="<?php print $page->admin_page_href('syndication.php', array('action' => 'Unsubscribe'), $link); ?>"><?php _e(($subscribed ? 'Unsubscribe' : 'Delete permanently')); ?></a>
1254 | <a href="<?php print esc_html($link->link_url); ?>"><?php _e('View')?></a></div>
1255 </div>
1256 </td>
1257 <?php if (strlen($link->link_rss) > 0): ?>
1258 <td><a href="<?php echo esc_html($link->link_rss); ?>"><?php echo esc_html(feedwordpress_display_url($link->link_rss, 32)); ?></a></td>
1259 <?php else: ?>
1260 <td class="feed-missing"><p><strong>no feed assigned</strong></p></td>
1261 <?php endif; ?>
1262
1263 <td><div style="float: right; padding-left: 10px">
1264 <input type="submit" class="button" name="update_uri[<?php print esc_html($link->link_rss); ?>]" value="<?php _e('Update Now'); ?>" />
1265 </div>
1266 <?php print $lastUpdated; ?>
1267 <?php print $fileSize; ?>
1268 <?php print $errorsSince; ?>
1269 <?php print $nextUpdate; ?>
1270 </td>
1271 </tr>
1272 <?php
1273 endforeach;
1274 else :
1275 ?>
1276 <tr><td colspan="4"><p>There are no websites currently listed for syndication.</p></td></tr>
1277 <?php
1278 endif;
1279 ?>
1280 </tbody>
1281 </table>
1282 <?php
1283 endif;
1284 } /* function fwp_syndication_manage_page_links_table_rows () */
1285
1286