Version Description
-
ADD BOILERPLATE / CREDITS FEATURE AVAILABLE IN POSTS & LINKS SETTINGS PANEL. I have added a new settings panel to the off-the-shelf features of FeedWordPress, under Syndication > Posts & Links (or under the Posts settings page for any individual feed), which allows you to define boilerplate text that should appear in connection with every syndicated post, or with every post syndicated from a particular feed. So, for example, if you want each syndicated post to include a byline reading "This is a syndicated post, reprinted from (LINK TO ORIGINAL SOURCE WEBSITE).", you could set up this byline from within the FeedWordPress settings interface, by going to the Boilerplate / Credits panel, and adding a line to appear BEFORE the CONTENT of each syndicated post, using the text and shortcode "This is a syndicated post, reprinted from [source]." For those of you who have corresponded with me about this feature before, you may be familiar with it from the long-standing "experimental" add-on, FWP+: Add Attribution; I've decided that it's been enough years, and I've had enough requests, that the Add Attribution feature may as well be included in the main FeedWordPress code.
Back when FeedWordPress was first created, the assumption was that a well-behaved aggregator would include boilerplate text to indicate the source of syndicated posts, but that the best way to do this was to provide a set of syndication-specific template tags so that the administrator setting up the site could edit their Theme template files with constructs like:
<?php if (is_syndicated()) : ?>
<?php endif; ?>You can still do this, of course, and for maximum expressive power and flexibility, it is certainly the best way to do it. Template Tags are documented here: http://feedwordpress.radgeek.com/wiki/templates/ However, (1) it requires writing PHP code, which not everyone is comfortable doing; and (2) it requires altering template files within your Theme, which is not always possible, especially given the increasing role that prepackaged commercial themes have come to play in the WordPress ecosystem. So, now, you can get some basic features for adding boilerplate text and attribution credits even without touching your template files, and without having to add custom add-ons for FeedWordPress. Enjoy!
MINOR CODE MODERNIZATION, PHP 7.1 COMPATIBILITY AND BUG FIXES. This project is now 12+ years old (good lord), and there are still some places where code was written at a time when PHP was a very different language from what it is now. Props to @david-robinson-practiceweb for pointing out and sending a pull request to fix some instances where obsolete PHP reference notation (
&$q
on parameters and so on) created a compatibility problem for PHP 7.1. Props to an email correspondent for pointing out a place in SyndicatedPost where excerpts should be generated from post content using encoding-aware mb_substr(), instead of naively running them through substr(). I've begun making some efforts throughout to begin auditing some of the creakiest old code in the project, to update what needs updating and improve documentation throughout.
Release Info
Developer | radgeek |
Plugin | FeedWordPress |
Version | 2017.1020 |
Comparing to | |
See all releases |
Code changes from version 2017.1004 to 2017.1020
- feedwordpress.php +217 -7
- feedwordpresssyndicationpage.class.php +1 -1
- posts-page.php +215 -1
- readme.txt +102 -321
- syndicatedpost.class.php +22 -16
@@ -3,15 +3,15 @@
|
|
3 |
Plugin Name: FeedWordPress
|
4 |
Plugin URI: http://feedwordpress.radgeek.com/
|
5 |
Description: simple and flexible Atom/RSS syndication for WordPress
|
6 |
-
Version: 2017.
|
7 |
-
Author:
|
8 |
-
Author URI:
|
9 |
License: GPL
|
10 |
*/
|
11 |
|
12 |
/**
|
13 |
* @package FeedWordPress
|
14 |
-
* @version 2017.
|
15 |
*/
|
16 |
|
17 |
# This uses code derived from:
|
@@ -32,13 +32,16 @@ License: GPL
|
|
32 |
|
33 |
# -- Don't change these unless you know what you're doing...
|
34 |
|
35 |
-
define ('FEEDWORDPRESS_VERSION', '2017.
|
36 |
-
define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://radgeek.com/contact');
|
37 |
|
38 |
if (!defined('FEEDWORDPRESS_BLEG')) :
|
39 |
define ('FEEDWORDPRESS_BLEG', true);
|
40 |
endif;
|
41 |
-
define('FEEDWORDPRESS_BLEG_BTC', '
|
|
|
|
|
|
|
42 |
|
43 |
// Defaults
|
44 |
define ('DEFAULT_SYNDICATION_CATEGORY', 'Contributors');
|
@@ -203,6 +206,33 @@ if (!$feedwordpress->needs_upgrade()) : // only work if the conditions are safe!
|
|
203 |
remove_filter('pre_link_rss', 'wp_filter_kses');
|
204 |
remove_filter('pre_link_url', 'wp_filter_kses');
|
205 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
206 |
# Admin menu
|
207 |
add_action('admin_init', array($feedwordpress, 'admin_init'));
|
208 |
add_action('admin_menu', 'fwp_add_pages');
|
@@ -927,6 +957,186 @@ function fwp_publish_post_hook ($post_id) {
|
|
927 |
return $ret;
|
928 |
} // function feedwordpress_save_edit_controls
|
929 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
930 |
################################################################################
|
931 |
## class FeedWordPress #########################################################
|
932 |
################################################################################
|
3 |
Plugin Name: FeedWordPress
|
4 |
Plugin URI: http://feedwordpress.radgeek.com/
|
5 |
Description: simple and flexible Atom/RSS syndication for WordPress
|
6 |
+
Version: 2017.1020
|
7 |
+
Author: C. Johnson
|
8 |
+
Author URI: https://feedwordpress.radgeek.com/contact/
|
9 |
License: GPL
|
10 |
*/
|
11 |
|
12 |
/**
|
13 |
* @package FeedWordPress
|
14 |
+
* @version 2017.1020
|
15 |
*/
|
16 |
|
17 |
# This uses code derived from:
|
32 |
|
33 |
# -- Don't change these unless you know what you're doing...
|
34 |
|
35 |
+
define ('FEEDWORDPRESS_VERSION', '2017.1020');
|
36 |
+
define ('FEEDWORDPRESS_AUTHOR_CONTACT', 'http://feedwordpress.radgeek.com/contact');
|
37 |
|
38 |
if (!defined('FEEDWORDPRESS_BLEG')) :
|
39 |
define ('FEEDWORDPRESS_BLEG', true);
|
40 |
endif;
|
41 |
+
define('FEEDWORDPRESS_BLEG_BTC', '15EsQ9QMZtLytsaVYZUaUCmrkSMaxZBTso');
|
42 |
+
define('FEEDWORDPRESS_BLEG_PAYPAL', '22PAJZZCK5Z3W');
|
43 |
+
|
44 |
+
define('FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER', 11000); // at the tail end of the filtering process
|
45 |
|
46 |
// Defaults
|
47 |
define ('DEFAULT_SYNDICATION_CATEGORY', 'Contributors');
|
206 |
remove_filter('pre_link_rss', 'wp_filter_kses');
|
207 |
remove_filter('pre_link_url', 'wp_filter_kses');
|
208 |
|
209 |
+
# Boilerplate functionality: hook in to title, excerpt, and content to add boilerplate text
|
210 |
+
$hookOrder = get_option('feedwordpress_boilerplate_hook_order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER);
|
211 |
+
add_filter(
|
212 |
+
/*hook=*/ 'the_title',
|
213 |
+
/*function=*/ 'add_boilerplate_title',
|
214 |
+
/*priority=*/ $hookOrder,
|
215 |
+
/*arguments=*/ 2
|
216 |
+
);
|
217 |
+
add_filter(
|
218 |
+
/*hook=*/ 'get_the_excerpt',
|
219 |
+
/*function=*/ 'add_boilerplate_excerpt',
|
220 |
+
/*priority=*/ $hookOrder,
|
221 |
+
/*arguments=*/ 1
|
222 |
+
);
|
223 |
+
add_filter(
|
224 |
+
/*hook=*/ 'the_content',
|
225 |
+
/*function=*/ 'add_boilerplate_content',
|
226 |
+
/*priority=*/ $hookOrder,
|
227 |
+
/*arguments=*/ 1
|
228 |
+
);
|
229 |
+
add_filter(
|
230 |
+
/*hook=*/ 'the_content_rss',
|
231 |
+
/*function=*/ 'add_boilerplate_content',
|
232 |
+
/*priority=*/ $hookOrder,
|
233 |
+
/*arguments=*/ 1
|
234 |
+
);
|
235 |
+
|
236 |
# Admin menu
|
237 |
add_action('admin_init', array($feedwordpress, 'admin_init'));
|
238 |
add_action('admin_menu', 'fwp_add_pages');
|
957 |
return $ret;
|
958 |
} // function feedwordpress_save_edit_controls
|
959 |
|
960 |
+
################################################################################
|
961 |
+
## class FeedWordPressBoilerplateReformatter ###################################
|
962 |
+
################################################################################
|
963 |
+
|
964 |
+
class FeedWordPressBoilerplateReformatter {
|
965 |
+
var $id, $element;
|
966 |
+
|
967 |
+
public function __construct ($id = NULL, $element = 'post') {
|
968 |
+
$this->id = $id;
|
969 |
+
$this->element = $element;
|
970 |
+
}
|
971 |
+
|
972 |
+
function shortcode_methods () {
|
973 |
+
return array(
|
974 |
+
'source' => 'source_link',
|
975 |
+
'source-name' => 'source_name',
|
976 |
+
'source-url' => 'source_url',
|
977 |
+
'original-link' => 'original_link',
|
978 |
+
'original-url' => 'original_url',
|
979 |
+
'author' => 'source_author_link',
|
980 |
+
'author-name' => 'source_author',
|
981 |
+
'feed-setting' => 'source_setting',
|
982 |
+
);
|
983 |
+
}
|
984 |
+
function do_shortcode ($template) {
|
985 |
+
$codes = $this->shortcode_methods();
|
986 |
+
|
987 |
+
// Register shortcodes relative to this object/post ID/element.
|
988 |
+
foreach ($codes as $code => $method) :
|
989 |
+
add_shortcode($code, array($this, $method));
|
990 |
+
endforeach;
|
991 |
+
|
992 |
+
$template = do_shortcode($template);
|
993 |
+
|
994 |
+
// Unregister shortcodes.
|
995 |
+
foreach ($codes as $code => $method) :
|
996 |
+
remove_shortcode($code);
|
997 |
+
endforeach;
|
998 |
+
|
999 |
+
return $template;
|
1000 |
+
}
|
1001 |
+
|
1002 |
+
function source_name ($atts) {
|
1003 |
+
$param = shortcode_atts(array(
|
1004 |
+
'original' => NULL,
|
1005 |
+
), $atts);
|
1006 |
+
return get_syndication_source($param['original'], $this->id);
|
1007 |
+
}
|
1008 |
+
function source_url ($atts) {
|
1009 |
+
$param = shortcode_atts(array(
|
1010 |
+
'original' => NULL,
|
1011 |
+
), $atts);
|
1012 |
+
return get_syndication_source_link($param['original'], $this->id);
|
1013 |
+
}
|
1014 |
+
function source_link ($atts) {
|
1015 |
+
switch (strtolower($atts[0])) :
|
1016 |
+
case '-name' :
|
1017 |
+
$ret = $this->source_name($atts);
|
1018 |
+
break;
|
1019 |
+
case '-url' :
|
1020 |
+
$ret = $this->source_url($atts);
|
1021 |
+
break;
|
1022 |
+
default :
|
1023 |
+
$param = shortcode_atts(array(
|
1024 |
+
'original' => NULL,
|
1025 |
+
), $atts);
|
1026 |
+
if ('title' == $this->element) :
|
1027 |
+
$ret = $this->source_name($atts);
|
1028 |
+
else :
|
1029 |
+
$ret = '<a href="'.htmlspecialchars($this->source_url($atts)).'">'.htmlspecialchars($this->source_name($atts)).'</a>';
|
1030 |
+
endif;
|
1031 |
+
endswitch;
|
1032 |
+
return $ret;
|
1033 |
+
}
|
1034 |
+
function source_setting ($atts) {
|
1035 |
+
$param = shortcode_atts(array(
|
1036 |
+
'key' => NULL,
|
1037 |
+
), $atts);
|
1038 |
+
return get_feed_meta($param['key'], $this->id);
|
1039 |
+
}
|
1040 |
+
function original_link ($atts, $text) {
|
1041 |
+
$url = $this->original_url($atts);
|
1042 |
+
return '<a href="'.esc_url($url).'">'.do_shortcode($text).'</a>';
|
1043 |
+
}
|
1044 |
+
function original_url ($atts) {
|
1045 |
+
return get_syndication_permalink($this->id);
|
1046 |
+
}
|
1047 |
+
function source_author ($atts) {
|
1048 |
+
return get_the_author();
|
1049 |
+
}
|
1050 |
+
function source_author_link ($atts) {
|
1051 |
+
switch (strtolower($atts[0])) :
|
1052 |
+
case '-name' :
|
1053 |
+
$ret = $this->source_author($atts);
|
1054 |
+
break;
|
1055 |
+
default :
|
1056 |
+
global $authordata; // Janky.
|
1057 |
+
if ('title' == $this->element) :
|
1058 |
+
$ret = $this->source_author($atts);
|
1059 |
+
else :
|
1060 |
+
$ret = get_the_author();
|
1061 |
+
$url = get_author_posts_url((int) $authordata->ID, (int) $authordata->user_nicename);
|
1062 |
+
if ($url) :
|
1063 |
+
$ret = '<a href="'.$url.'" '
|
1064 |
+
.'title="Read other posts by '.esc_html($authordata->display_name).'">'
|
1065 |
+
.$ret
|
1066 |
+
.'</a>';
|
1067 |
+
endif;
|
1068 |
+
endif;
|
1069 |
+
endswitch;
|
1070 |
+
return $ret;
|
1071 |
+
}
|
1072 |
+
}
|
1073 |
+
|
1074 |
+
function add_boilerplate_reformat ($template, $element, $id = NULL) {
|
1075 |
+
if ('post' == $element and !preg_match('/< (p|div) ( \s [^>]+ )? >/xi', $template)) :
|
1076 |
+
$template = '<p class="syndicated-attribution">'.$template.'</p>';
|
1077 |
+
endif;
|
1078 |
+
|
1079 |
+
$ref = new FeedWordPressBoilerplateReformatter($id, $element);
|
1080 |
+
return $ref->do_shortcode($template);
|
1081 |
+
}
|
1082 |
+
|
1083 |
+
function add_boilerplate_simple ($element, $title, $id = NULL) {
|
1084 |
+
if (is_syndicated($id)) :
|
1085 |
+
$meta = get_feed_meta('boilerplate rules', $id);
|
1086 |
+
if ($meta and !is_array($meta)) : $meta = unserialize($meta); endif;
|
1087 |
+
|
1088 |
+
if (!is_array($meta) or empty($meta)) :
|
1089 |
+
$meta = get_option('feedwordpress_boilerplate');
|
1090 |
+
endif;
|
1091 |
+
|
1092 |
+
if (is_array($meta) and !empty($meta)) :
|
1093 |
+
foreach ($meta as $rule) :
|
1094 |
+
if ($element==$rule['element']) :
|
1095 |
+
$rule['template'] = add_boilerplate_reformat($rule['template'], $element, $id);
|
1096 |
+
|
1097 |
+
if ('before'==$rule['placement']) :
|
1098 |
+
$title = $rule['template'] . ' ' . $title;
|
1099 |
+
else :
|
1100 |
+
$title = $title . ' ' . $rule['template'];
|
1101 |
+
endif;
|
1102 |
+
endif;
|
1103 |
+
endforeach;
|
1104 |
+
endif;
|
1105 |
+
endif;
|
1106 |
+
return $title;
|
1107 |
+
}
|
1108 |
+
function add_boilerplate_title ($title, $id = NULL) {
|
1109 |
+
return add_boilerplate_simple('title', $title, $id);
|
1110 |
+
}
|
1111 |
+
function add_boilerplate_excerpt ($title, $id = NULL) {
|
1112 |
+
return add_boilerplate_simple('excerpt', $title, $id);
|
1113 |
+
}
|
1114 |
+
function add_boilerplate_content ($content) {
|
1115 |
+
if (is_syndicated()) :
|
1116 |
+
$meta = get_feed_meta('boilerplate rules');
|
1117 |
+
if ($meta and !is_array($meta)) : $meta = unserialize($meta); endif;
|
1118 |
+
|
1119 |
+
if (!is_array($meta) or empty($meta)) :
|
1120 |
+
$meta = get_option('feedwordpress_boilerplate');
|
1121 |
+
endif;
|
1122 |
+
|
1123 |
+
if (is_array($meta) and !empty($meta)) :
|
1124 |
+
foreach ($meta as $rule) :
|
1125 |
+
if ('post'==$rule['element']) :
|
1126 |
+
$rule['template'] = add_boilerplate_reformat($rule['template'], 'post');
|
1127 |
+
|
1128 |
+
if ('before'==$rule['placement']) :
|
1129 |
+
$content = $rule['template'] . "\n" . $content;
|
1130 |
+
else :
|
1131 |
+
$content = $content . "\n" . $rule['template'];
|
1132 |
+
endif;
|
1133 |
+
endif;
|
1134 |
+
endforeach;
|
1135 |
+
endif;
|
1136 |
+
endif;
|
1137 |
+
return $content;
|
1138 |
+
}
|
1139 |
+
|
1140 |
################################################################################
|
1141 |
## class FeedWordPress #########################################################
|
1142 |
################################################################################
|
@@ -736,7 +736,7 @@ support, and documentation.</p>
|
|
736 |
|
737 |
<div style="display: inline-block; vertical-align: bottom">
|
738 |
<input type="image" name="submit" src="<?php print esc_url(plugins_url('/' . FeedWordPress::path('paypal-donation-64px.png' ) ) ); ?>" alt="Donate through PayPal" />
|
739 |
-
<input type="hidden" name="business" value="
|
740 |
<input type="hidden" name="cmd" value="_xclick" />
|
741 |
<input type="hidden" name="item_name" value="FeedWordPress donation" />
|
742 |
<input type="hidden" name="no_shipping" value="1" />
|
736 |
|
737 |
<div style="display: inline-block; vertical-align: bottom">
|
738 |
<input type="image" name="submit" src="<?php print esc_url(plugins_url('/' . FeedWordPress::path('paypal-donation-64px.png' ) ) ); ?>" alt="Donate through PayPal" />
|
739 |
+
<input type="hidden" name="business" value="<?php print esc_attr(FEEDWORDPRESS_BLEG_PAYPAL); ?>" />
|
740 |
<input type="hidden" name="cmd" value="_xclick" />
|
741 |
<input type="hidden" name="item_name" value="FeedWordPress donation" />
|
742 |
<input type="hidden" name="no_shipping" value="1" />
|
@@ -119,11 +119,36 @@ class FeedWordPressPostsPage extends FeedWordPressAdminPage {
|
|
119 |
update_option('feedwordpress_syndicated_post_type', $post['syndicated_post_type']);
|
120 |
endif;
|
121 |
endif;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
122 |
parent::save_settings($post);
|
123 |
}
|
124 |
|
125 |
/**
|
126 |
-
* Outputs "Publication" settings box.
|
127 |
*
|
128 |
* @since 2009.0713
|
129 |
* @param object $page of class FeedWordPressPostsPage tells us whether this is
|
@@ -498,11 +523,198 @@ class FeedWordPressPostsPage extends FeedWordPressAdminPage {
|
|
498 |
<?php
|
499 |
} /* FeedWordPressPostsPage::custom_post_types_box() */
|
500 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
501 |
function display () {
|
502 |
$this->boxes_by_methods = array(
|
503 |
'publication_box' => __('Syndicated Posts'),
|
504 |
'links_box' => __('Links'),
|
505 |
'formatting_box' => __('Formatting'),
|
|
|
506 |
'comments_and_pings_box' => __('Comments & Pings'),
|
507 |
'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
|
508 |
'custom_post_types_box' => ('Custom Post Types (advanced database settings)'),
|
@@ -510,6 +722,8 @@ class FeedWordPressPostsPage extends FeedWordPressAdminPage {
|
|
510 |
|
511 |
parent::display();
|
512 |
} /* FeedWordPressPostsPage::display () */
|
|
|
|
|
513 |
}
|
514 |
|
515 |
$postsPage = new FeedWordPressPostsPage;
|
119 |
update_option('feedwordpress_syndicated_post_type', $post['syndicated_post_type']);
|
120 |
endif;
|
121 |
endif;
|
122 |
+
|
123 |
+
if (isset($post['save']) or isset($post['submit'])) :
|
124 |
+
if (isset($post['boilerplate'])) :
|
125 |
+
foreach ($post['boilerplate'] as $index => $line) :
|
126 |
+
if (0 == strlen(trim($line['template']))) :
|
127 |
+
unset($post['boilerplate'][$index]);
|
128 |
+
endif;
|
129 |
+
endforeach;
|
130 |
+
|
131 |
+
// Convert indexes to 0..(N-1) to avoid possible collisions
|
132 |
+
$post['boilerplate'] = array_values($post['boilerplate']);
|
133 |
+
|
134 |
+
if ($this->for_feed_settings()) :
|
135 |
+
$this->link->settings['boilerplate rules'] = serialize($post['boilerplate']);
|
136 |
+
$this->link->save_settings(/*reload=*/ true);
|
137 |
+
else :
|
138 |
+
update_option('feedwordpress_boilerplate', $post['boilerplate']);
|
139 |
+
endif;
|
140 |
+
endif;
|
141 |
+
|
142 |
+
if (isset($post['boilerplate_hook_order'])) :
|
143 |
+
$this->update_setting('boilerplate hook order', intval($post['boilerplate_hook_order']));
|
144 |
+
endif;
|
145 |
+
endif;
|
146 |
+
|
147 |
parent::save_settings($post);
|
148 |
}
|
149 |
|
150 |
/**
|
151 |
+
* publication_box: Outputs "Publication" settings box.
|
152 |
*
|
153 |
* @since 2009.0713
|
154 |
* @param object $page of class FeedWordPressPostsPage tells us whether this is
|
523 |
<?php
|
524 |
} /* FeedWordPressPostsPage::custom_post_types_box() */
|
525 |
|
526 |
+
public function boilerplate_box ($page, $box = NULL) {
|
527 |
+
if ($page->for_feed_settings()) :
|
528 |
+
$attrib = unserialize($page->link->settings['boilerplate rules']);
|
529 |
+
$syndicatedPosts = 'this feed\'s posts';
|
530 |
+
else :
|
531 |
+
$attrib = get_option('feedwordpress_boilerplate');
|
532 |
+
$syndicatedPosts = 'syndicated posts';
|
533 |
+
endif;
|
534 |
+
$hookOrder = intval($page->setting('boilerplate hook order', FEEDWORDPRESS_BOILERPLATE_DEFAULT_HOOK_ORDER));
|
535 |
+
?>
|
536 |
+
<style type="text/css">
|
537 |
+
.boilerplate-help-box {
|
538 |
+
float: right;
|
539 |
+
width: 300px;
|
540 |
+
border: 1px dotted #777;
|
541 |
+
margin: 3px;
|
542 |
+
padding: 5px;
|
543 |
+
background-color: #f7f7f7;
|
544 |
+
}
|
545 |
+
.boilerplate-help-box dt {
|
546 |
+
font-weight: bold;
|
547 |
+
font-size: 85%;
|
548 |
+
}
|
549 |
+
.boilerplate-help-box dd {
|
550 |
+
font-size: 80%; line-height: 100%; font-style: italic;
|
551 |
+
padding-left: 1.5em;
|
552 |
+
}
|
553 |
+
.boilerplate-help-box code {
|
554 |
+
font-size: inherit;
|
555 |
+
font-style: normal;
|
556 |
+
background-color: inherit;
|
557 |
+
}
|
558 |
+
|
559 |
+
.boilerplate-li {
|
560 |
+
padding-bottom: 5px;
|
561 |
+
margin-bottom: 5px;
|
562 |
+
border-bottom: 1px dotted black;
|
563 |
+
}
|
564 |
+
|
565 |
+
</style>
|
566 |
+
|
567 |
+
<div class="boilerplate-help-box">
|
568 |
+
<p style="border-bottom: 1px dotted #777;">To remove boilerplate, just blank out the text box and leave it empty.</p>
|
569 |
+
|
570 |
+
<p>Use shortcodes to include information about your source:</p>
|
571 |
+
<dl>
|
572 |
+
<dt><code>[source]</code></dt>
|
573 |
+
<dd>A link to the source you syndicated the post from</dd>
|
574 |
+
|
575 |
+
<dt><code>[source-name]</code></dt>
|
576 |
+
<dd>Name of the source you syndicated the post from</dd>
|
577 |
+
|
578 |
+
<dt><code>[source-url]</code></dt>
|
579 |
+
<dd>URL of the source you syndicated the post from</dd>
|
580 |
+
|
581 |
+
<dt><code>[original-link]text[/original-link]</code></dt>
|
582 |
+
<dd>A link to the <em>original post</em> back on the source website,
|
583 |
+
using <code>text</code> as the link text.</dd>
|
584 |
+
|
585 |
+
<dt><code>[original-url]</code></dt>
|
586 |
+
<dd>URL of the <em>original post</em> back on the source website</dd>
|
587 |
+
|
588 |
+
<dt><code>[author]</code></dt>
|
589 |
+
<dd>A link with the name of the author who wrote the post, linking to other posts by the same author</dd>
|
590 |
+
|
591 |
+
<dt><code>[author-name]</code></dt>
|
592 |
+
<dd>Name of the author who wrote the post</dd>
|
593 |
+
|
594 |
+
<dt><code>[feed-setting key="setting-name"]</code></dt>
|
595 |
+
<dd>Value of a custom feed setting (named <code>setting-name</code>) for the feed</dd>
|
596 |
+
</dl>
|
597 |
+
</div>
|
598 |
+
|
599 |
+
<?php
|
600 |
+
print "<ul>\n";
|
601 |
+
if (!is_array($attrib)) : $attrib = array(); endif;
|
602 |
+
|
603 |
+
print '<input type="hidden" id="next-boilerplate-rule-index" name="next_boilerplate_rule_index" value="'.count($attrib).'" />';
|
604 |
+
|
605 |
+
// In AJAX environment, this is a dummy rule that stays hidden. In a
|
606 |
+
// non-AJAX environment, this provides a blank rule that we can fill in.
|
607 |
+
$attrib['new'] = array(
|
608 |
+
'class' => array('hide-if-js'),
|
609 |
+
'placement' => 'before',
|
610 |
+
'element' => 'post',
|
611 |
+
'template' => '',
|
612 |
+
);
|
613 |
+
|
614 |
+
foreach ($attrib as $index => $line) :
|
615 |
+
if (isset($line['template'])) :
|
616 |
+
$selected['before'] = (($line['placement']=='before') ? ' selected="selected"' : '');
|
617 |
+
$selected['after'] = (($line['placement']=='after') ? ' selected="selected"' : '');
|
618 |
+
$selected['title'] = (($line['element']=='title') ? ' selected="selected"' : '');
|
619 |
+
$selected['post'] = (($line['element']=='post') ? ' selected="selected"' : '');
|
620 |
+
$selected['excerpt'] = (($line['element']=='excerpt') ? ' selected="selected"' : '');
|
621 |
+
|
622 |
+
if (!isset($line['class'])) : $line['class'] = array(); endif;
|
623 |
+
$line['class'][] = 'boilerplate-li';
|
624 |
+
?>
|
625 |
+
|
626 |
+
<li id="boilerplate-<?php print $index; ?>-li" class="<?php print implode(' ', $line['class']); ?>">» <strong>Add</strong> <select id="boilerplate-<?php print $index; ?>-placement" name="boilerplate[<?php print $index; ?>][placement]" style="width: 8.0em">
|
627 |
+
<option value="before"<?php print $selected['before']; ?>>before</option>
|
628 |
+
<option value="after"<?php print $selected['after']; ?>>after</option>
|
629 |
+
</select> the <select style="width: 8.0em" id="boilerplate-<?php print $index; ?>-element" name="boilerplate[<?php print $index; ?>][element]">
|
630 |
+
<option value="title"<?php print $selected['title']; ?>>title</option>
|
631 |
+
<option value="post"<?php print $selected['post']; ?>>content</option>
|
632 |
+
<option value="excerpt"<?php print $selected['excerpt']; ?>>excerpt</option>
|
633 |
+
</select> of
|
634 |
+
<?php print $syndicatedPosts; ?>: <textarea style="vertical-align: top; width: 40%;" rows="2" cols="30" class="boilerplate-template" id="boilerplate-<?php print $index; ?>-template" name="boilerplate[<?php print $index; ?>][template]"><?php print htmlspecialchars($line['template']); ?></textarea></li>
|
635 |
+
<?php
|
636 |
+
endif;
|
637 |
+
endforeach;
|
638 |
+
?>
|
639 |
+
</ul>
|
640 |
+
<br style="clear: both" />
|
641 |
+
|
642 |
+
<script type="text/javascript">
|
643 |
+
jQuery(document).ready( function($) {
|
644 |
+
$('.boilerplate-template').blur( function() {
|
645 |
+
if (this.value.length == 0) {
|
646 |
+
var theLi = $('li:has(#'+this.id+")");
|
647 |
+
theLi.hide('normal')
|
648 |
+
}
|
649 |
+
} );
|
650 |
+
|
651 |
+
var addRuleLi = document.createElement('li');
|
652 |
+
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> ….';
|
653 |
+
$('#boilerplate-new-li').after(addRuleLi);
|
654 |
+
|
655 |
+
$('#add-new-boilerplate-rule').click( function() {
|
656 |
+
// Get index counter
|
657 |
+
var nextIndex = parseInt($('#next-boilerplate-rule-index').val());
|
658 |
+
|
659 |
+
var newIdPrefix = 'boilerplate-'+nextIndex;
|
660 |
+
var newNamePrefix = 'boilerplate['+nextIndex+']';
|
661 |
+
|
662 |
+
var dummy = {};
|
663 |
+
dummy['li'] = {'el': $('#boilerplate-new-li') }
|
664 |
+
dummy['placement'] = {'el': $('#boilerplate-new-placement') };
|
665 |
+
dummy['element'] = {'el': $('#boilerplate-new-element') };
|
666 |
+
dummy['template'] = {'el': $('#boilerplate-new-template') };
|
667 |
+
|
668 |
+
for (var element in dummy) {
|
669 |
+
dummy[element]['save'] = {
|
670 |
+
'id': dummy[element]['el'].attr('id'),
|
671 |
+
'name': dummy[element]['el'].attr('name')
|
672 |
+
};
|
673 |
+
dummy[element]['el'].attr('id', newIdPrefix+'-'+element);
|
674 |
+
dummy[element]['el'].attr('name', newNamePrefix+'['+element+']');
|
675 |
+
}
|
676 |
+
|
677 |
+
var newLi = $('#'+newIdPrefix+'-li').clone(/*events=*/ true);
|
678 |
+
//newLi.attr('id', null);
|
679 |
+
newLi.removeClass('hide-if-js');
|
680 |
+
newLi.addClass('boilerplate-li');
|
681 |
+
newLi.css('display', 'none');
|
682 |
+
|
683 |
+
// Switch back
|
684 |
+
for (var element in dummy) {
|
685 |
+
dummy[element]['el'].attr('id', dummy[element]['save']['id']);
|
686 |
+
dummy[element]['el'].attr('name', dummy[element]['save']['name']);
|
687 |
+
}
|
688 |
+
|
689 |
+
$('#boilerplate-new-li').before(newLi);
|
690 |
+
newLi.show('normal');
|
691 |
+
|
692 |
+
$('#next-boilerplate-rule-index').val(nextIndex+1);
|
693 |
+
|
694 |
+
return false;
|
695 |
+
} )
|
696 |
+
} );
|
697 |
+
</script>
|
698 |
+
<?php
|
699 |
+
if ($page->for_default_settings()) :
|
700 |
+
?>
|
701 |
+
<h3>Advanced Settings</h3>
|
702 |
+
<table class="edit-form narrow">
|
703 |
+
<tbody>
|
704 |
+
<tr><th scope="row"><?php _e("Hook Order:") ?></th>
|
705 |
+
<td><input type="number" name="boilerplate_hook_order" value="<?php print esc_attr($hookOrder); ?>" /></td></tr>
|
706 |
+
</tbody>
|
707 |
+
</table>
|
708 |
+
<?php
|
709 |
+
endif;
|
710 |
+
} /* FeedWordPressPostsPage::boilerplate_box() */
|
711 |
+
|
712 |
function display () {
|
713 |
$this->boxes_by_methods = array(
|
714 |
'publication_box' => __('Syndicated Posts'),
|
715 |
'links_box' => __('Links'),
|
716 |
'formatting_box' => __('Formatting'),
|
717 |
+
'boilerplate_box' => ('Boilerplate / Credits'),
|
718 |
'comments_and_pings_box' => __('Comments & Pings'),
|
719 |
'custom_post_settings_box' => __('Custom Post Settings (to apply to each syndicated post)'),
|
720 |
'custom_post_types_box' => ('Custom Post Types (advanced database settings)'),
|
722 |
|
723 |
parent::display();
|
724 |
} /* FeedWordPressPostsPage::display () */
|
725 |
+
|
726 |
+
|
727 |
}
|
728 |
|
729 |
$postsPage = new FeedWordPressPostsPage;
|
@@ -1,322 +1,181 @@
|
|
1 |
=== FeedWordPress ===
|
2 |
-
Contributors:
|
3 |
Donate link: http://feedwordpress.radgeek.com/
|
4 |
Tags: syndication, aggregation, feed, atom, rss
|
5 |
Requires at least: 4.5
|
6 |
Tested up to: 4.8.2
|
7 |
-
Stable tag: 2017.
|
8 |
|
9 |
FeedWordPress syndicates content from feeds you choose into your WordPress weblog.
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
-
* Author: [
|
14 |
* Project URI: <http://feedwordpress.radgeek.com/>
|
15 |
* License: GPL 2. See License below for copyright jots and tittles.
|
16 |
|
17 |
-
FeedWordPress is an Atom/RSS aggregator for WordPress. It syndicates content
|
18 |
-
from feeds that you choose into your WordPress weblog; the content it syndicates
|
19 |
-
appears as a series of special posts in your WordPress posts database. If you
|
20 |
-
syndicate several feeds then you can use WordPress's posts database and
|
21 |
-
templating engine as the back-end of an aggregation ("planet") website. It was
|
22 |
-
developed, originally, because I needed a more flexible replacement for
|
23 |
-
[Planet][] to use at Feminist Blogs, an aggregator site that I used to administer.
|
24 |
|
25 |
[Planet]: http://www.planetplanet.org/
|
26 |
|
27 |
-
FeedWordPress is designed with flexibility, ease of use, and ease of
|
28 |
-
configuration in mind. You'll need a working installation of WordPress (version
|
29 |
-
[3.0] or later), and also FTP or SFTP access to your web host. The ability to
|
30 |
-
create cron jobs on your web host is helpful but not required. You *don't* need
|
31 |
-
to tweak any plain-text configuration files and you *don't* need shell access
|
32 |
-
to your web host to make it work. (Although, I should point out, web hosts that
|
33 |
-
*don't* offer shell access are *bad web hosts*.)
|
34 |
|
35 |
[WordPress]: http://wordpress.org/
|
36 |
[WordPress MU]: http://mu.wordpress.org/
|
37 |
-
[
|
38 |
|
39 |
== Installation ==
|
40 |
|
41 |
To use FeedWordPress, you will need:
|
42 |
|
43 |
-
* an installed and configured copy of [WordPress][] or
|
44 |
-
(version 3.0 or later).
|
45 |
|
46 |
-
*
|
47 |
|
48 |
= New Installations =
|
49 |
|
50 |
-
1. Download the FeedWordPress installation package and extract the files on
|
51 |
-
your computer.
|
52 |
|
53 |
-
2. Create a new directory named `feedwordpress` in the `wp-content/plugins`
|
54 |
-
directory of your WordPress installation. Use an FTP or SFTP client to
|
55 |
-
upload the contents of your FeedWordPress archive to the new directory
|
56 |
-
that you just created on your web host.
|
57 |
|
58 |
3. Log in to the WordPress Dashboard and activate the FeedWordPress plugin.
|
59 |
|
60 |
-
4. Once the plugin is activated, a new **Syndication** section should
|
61 |
-
appear in your WordPress admin menu. Click here to add new syndicated
|
62 |
-
feeds, set up configuration options, and determine how FeedWordPress
|
63 |
-
will check for updates. For help, see the [FeedWordPress Quick Start][]
|
64 |
-
page.
|
65 |
|
66 |
[FeedWordPress Quick Start]: http://feedwordpress.radgeek.com/wiki/quick-start
|
67 |
|
68 |
= Upgrades =
|
69 |
|
70 |
-
To *upgrade* an existing installation of FeedWordPress to the most recent
|
71 |
-
release:
|
72 |
|
73 |
-
1. Download the FeedWordPress installation package and extract the files on
|
74 |
-
your computer.
|
75 |
|
76 |
-
2. Upload the new PHP files to `wp-content/plugins/feedwordpress`,
|
77 |
-
overwriting any existing FeedWordPress files that are there.
|
78 |
|
79 |
-
3. Log in to your WordPress administrative interface immediately in order
|
80 |
-
to see whether there are any further tasks that you need to perform
|
81 |
-
to complete the upgrade.
|
82 |
|
83 |
4. Enjoy your newer and hotter installation of FeedWordPress
|
84 |
|
85 |
== Using and Customizing FeedWordPress ==
|
86 |
|
87 |
-
FeedWordPress has many options which can be accessed through the WordPress
|
88 |
-
Dashboard, and a lot of functionality accessible programmatically through
|
89 |
-
WordPress templates or plugins. For further documentation of the ins and
|
90 |
-
outs, see the documentation at the [FeedWordPress project homepage][].
|
91 |
|
92 |
[FeedWordPress project homepage]: http://feedwordpress.radgeek.com/
|
93 |
|
94 |
== Changelog ==
|
95 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
= 2017.0913 =
|
97 |
|
98 |
-
* PARTIAL FIX FOR 2X DUPLICATE POSTS APPEARING ON DUAL HTTP/HTTPS SITES: Some
|
99 |
-
users reported an issue in which their FeedWordPress sites, which are over
|
100 |
-
both insecure HTTP and over HTTPS, would pick up exactly 2 copies of every
|
101 |
-
post or almost every post from certain feeds, and where the guids for each
|
102 |
-
of the pair of duplicate posts would look exactly alike, except for a
|
103 |
-
difference in the protocol, for example:
|
104 |
|
105 |
http://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545
|
106 |
https://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545
|
107 |
|
108 |
-
... where www.example.com is the server that your own copy of FeedWordPress
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
* PHP
|
113 |
-
failures -- remove the use of depreciated mysql_error() function, and make
|
114 |
-
sure all classes make use of __construct() convention for constructors.
|
115 |
-
|
116 |
-
* AVOID "PHP Warning: shell_exec() has been disabled for security reasons in
|
117 |
-
[...]/feedwordpress/feeds-page.php on line 197": FeedWordPress uses the PHP
|
118 |
-
shell_exec() function in a very narrowly limited way for information gathering,
|
119 |
-
trying to find the real path to curl or wget on your system, so that it can
|
120 |
-
give as realistic as possible a recommendation for the sample crontab line
|
121 |
-
displayed in Syndication > Feeds & Updates. Some web hosting environments
|
122 |
-
disable shell_exec for security reasons (since it could in theory be used to
|
123 |
-
do a lot more stuff than the very limited information gathering FWP uses it
|
124 |
-
for); in which case, this part of the code in FeedWordPress could spit out
|
125 |
-
a nasty-looking and potentially worrisome-looking error message. So, now this
|
126 |
-
code is fenced with checks to make sure that shell_exec is available, before
|
127 |
-
FWP attempts to make use of it.
|
128 |
|
129 |
= 2016.1213 =
|
130 |
|
131 |
-
* WORDPRESS BACKWARD COMPATIBILITY FOR VERSIONS [4.5, 4.7]: This change fixes
|
132 |
-
|
133 |
-
"
|
134 |
-
on others, you might just see an HTTP 500 Internal Server Error or a blank
|
135 |
-
page) when using FeedWordPress with versions of WordPress before 4.7. A
|
136 |
-
change that I introduced to avoid a code module that had been deprecated in
|
137 |
-
version 4.7 ended up relying on code modules that were only introduced as
|
138 |
-
of version 4.7; so now, instead, FeedWordPress attempts to detect which
|
139 |
-
modules the current version of the WordPress core makes available, and load
|
140 |
-
the right modules depending on your WordPress version.
|
141 |
-
|
142 |
-
In theory, up to this point, FeedWordPress supported any version of
|
143 |
-
WordPress from version 3.0 onward. In practice, version 3.0 was released
|
144 |
-
over 6 years ago, and I can realistically commit only to testing out new
|
145 |
-
releases of FeedWordPress with a few prior versions of WordPress; so I've
|
146 |
-
updated the "Requires at least" field to version 4.5, the first major
|
147 |
-
release issued in 2016. If you've really got to use FeedWordPress with
|
148 |
-
older versions of WordPress, it will probably still work with any moderately
|
149 |
-
modern release of WordPress, but I won't promise to keep it working with
|
150 |
-
releases of WordPress that are more than about a year old.
|
151 |
|
152 |
= 2016.1211 =
|
153 |
|
154 |
* WORDPRESS COMPATIBILITY: Tested with new versions of WordPress up to 4.7.
|
155 |
|
156 |
-
* PHP WARNINGS UNDER WP 4.7: Eliminated cause of a PHP warning under WP 4.7
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
the issue and @garymarkfuller for suggesting a preliminary fix to the issue
|
162 |
-
that was fairly similar to the solution I ended up adopting.
|
163 |
-
|
164 |
-
* PHP 7 and PHP Strict Standards compatibility changes: @alexiskulash @daidais
|
165 |
-
and @zoul0813 all sent pull requests through Github to fix some issues from
|
166 |
-
a very old code base that has made its way from PHP 3.x through 5.x to the
|
167 |
-
roll-out of PHP 7. Class methods should now fare better under modern versions
|
168 |
-
of PHP and generate fewer "Deprecated" notices.
|
169 |
-
|
170 |
-
* IMPROVEMENTS TO SCHEDULED AND AUTOMATIC UPDATES: use wp_loaded hook to check
|
171 |
-
for magic URL parameters and to execute updates, to do pageload-based automatic
|
172 |
-
updates, etc. Ensures that anything plugins or themes need to do in init to set
|
173 |
-
up custom post types, taxonomies, etc. will be done before the update_feedwordpress
|
174 |
-
updates are attempted. If you saw posts not getting put into the correct custom
|
175 |
-
post type or custom taxonomies or similar problems when performing scheduled updates,
|
176 |
-
but the problem seemed to go away when you manually performed updates through the
|
177 |
-
wp-admin interface, then you might be able to solve those problems with this update.
|
178 |
|
179 |
= 2016.0420 =
|
180 |
|
181 |
* WORDPRESS COMPATIBILITY: Tested with new versions of WordPress up to 4.5.
|
182 |
|
183 |
-
* FILTERS AND ADD-ONS: Allow filters and add-ons to filter terms and taxonomy
|
184 |
-
|
185 |
-
|
186 |
-
syndicated_post_terms_unfamiliar, syndicated_post_terms_mapping,
|
187 |
-
syndicated_item_feed_terms, and syndicated_item_preset_terms filters.
|
188 |
-
|
189 |
-
* FILTERS AND ADD-ONS: Globals $fwp_channel and $fwp_feedmeta REMOVED.
|
190 |
-
These global variables, originally introduced to allow filters access to
|
191 |
-
information about the source feed in `syndicated_item` filters were
|
192 |
-
deprecated 6+ years ago. If you have any filters or add-ons which still
|
193 |
-
depend on these global variables, you've been using obsolete techniques
|
194 |
-
and you should see about fixing them to access data about the source feed
|
195 |
-
using the SyndicatedPost::link element instead. For documentation, see
|
196 |
-
the FeedWordPress documentation wiki at
|
197 |
-
<http://feedwordpress.radgeek.com/wiki/syndicatedpost> and
|
198 |
-
<http://feedwordpress.radgeek.com/wiki/syndicatedlink>.
|
199 |
|
200 |
-
* BUGFIX: Syndication > Diagnostics HTTP diagnostic test widget was broken due to
|
201 |
-
a dumb error on my part. Now fixed.
|
202 |
|
203 |
-
* SMALL CODING CHANGES: Lots of small changes to code organization, incorporation
|
204 |
-
of some PHP 5.x coding conventions, etc.
|
205 |
|
206 |
= 2015.0514 =
|
207 |
|
208 |
-
* IMPORTANT SECURITY UPDATE: This version includes two important fixes for
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
which
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
The second is a security vulnerability fixes a security vulnerability that
|
220 |
-
was reported to me privately (thanks to Adrián M. F.) which, under other
|
221 |
-
low-probability conditions, could allow for SQL insertion attacks by
|
222 |
-
a malicious user with access to login credentials, which would compromise
|
223 |
-
data security.
|
224 |
-
|
225 |
-
It is *IMPORTANT* and worth your while to upgrade FeedWordPress as soon as
|
226 |
-
possible in order to eliminate these vulnerabilities. If you have any
|
227 |
-
questions or if there is something blocking you from making the upgrade
|
228 |
-
which you need my help with, don't hesitate to get in touch.
|
229 |
-
|
230 |
-
* ADMIN UI BUGFIX: "Update Now" button in feeds setting pages should now work
|
231 |
-
once again instead of causing a PHP fatal error. See
|
232 |
-
<https://github.com/radgeek/feedwordpress/issues/46>
|
233 |
-
|
234 |
-
* SEVERAL OTHER SMALL BUG FIXES. See <https://github.com/radgeek/feedwordpress/issues/32>
|
235 |
-
<https://github.com/radgeek/feedwordpress/issues/30>
|
236 |
-
<https://github.com/radgeek/feedwordpress/issues/29>
|
237 |
-
etc.
|
238 |
|
239 |
= 2014.0805 =
|
240 |
|
241 |
-
* FILTERS AND ADD-ONS: A number of new hooks for filters and add-ons to
|
242 |
-
further customize the behavior of FWP have been added.
|
243 |
|
244 |
-
* COMPATIBILITY/BUGFIX: Many users saw odd characters, especially "n,"
|
245 |
-
appearing in posts in versions of WordPress from 3.6 on, due to a change
|
246 |
-
in when the API expects HTML data for posts to be slashed and when it
|
247 |
-
does not. This has been fixed, so that the junk characters should no
|
248 |
-
longer appear, regardless of your version of WordPress.
|
249 |
|
250 |
-
* BUGFIX: A bug preventing FWP from saving categories assigned under
|
251 |
-
Syndication > Categories & Tags has been fixed.
|
252 |
|
253 |
-
* BUGFIX: Post-editing related metaboxes should now show up when you edit
|
254 |
-
items of any post type, including custom types, not only normal WordPress
|
255 |
-
posts.
|
256 |
|
257 |
-
* BUGFIX: A bug in the admin UI that caused the "Alternative Feeds" /
|
258 |
-
"Find Feeds" box to throw a permissions error has been fixed.
|
259 |
|
260 |
-
* BUGFIX: A bug preventing proper mapping of categories and other terms in
|
261 |
-
2013.0504 has been fixed.
|
262 |
|
263 |
-
* BUGFIX: A number of small fixes contributed through Github by Flynsarmy
|
264 |
-
should eliminate PHP warnings for many users on several methods that are
|
265 |
-
called as static methods within FeedWordPress.
|
266 |
|
267 |
= 2013.0504 =
|
268 |
|
269 |
-
* BUGFIX: PHP 5.4 compatibility -- includes some more extensive fixes to
|
270 |
-
compatibility issues with PHP 5.4's handling of global variables
|
271 |
|
272 |
-
* DIAGNOSTICS: New diagnostics settings added to help track behavior of
|
273 |
-
terms (categories, post tags, etc.) for syndicated posts.
|
274 |
|
275 |
= 2012.0504 =
|
276 |
|
277 |
-
* MODULE REORGANIZATION: Should ensure that all needed submodules will be
|
278 |
-
properly included regardless of whether you are installing from github,
|
279 |
-
from SVN, or from the WordPress plugins page. If you've been getting
|
280 |
-
fatal errors about required modules not being found, this release should
|
281 |
-
hopefully resolve the issue.
|
282 |
|
283 |
= 2012.0503 =
|
284 |
|
285 |
-
* BUGFIX: Works properly again with WordPress installations that use a
|
286 |
-
MySQL table name prefix other than the default `wp_` prefix.
|
287 |
|
288 |
-
* BUGFIX: Includes a couple of significant PHP 5.4 compatibility fixes.
|
289 |
-
Now that PHP 5.4 is more widely deployed, Diagnostics will now also
|
290 |
-
show PHP version and some other potentially useful troubleshooting
|
291 |
-
information.
|
292 |
|
293 |
-
* ADMIN UI: Better indicates your options when deleting a syndicated post
|
294 |
-
so as to let you know whether it will be Trashed (and thus not
|
295 |
-
resyndicated) or Erased (and thus potentially resyndicated)
|
296 |
|
297 |
-
* ADMIN UI: Adds an AJAXy Test Expression button to allow live testing of
|
298 |
-
sample results from expressions in Custom Post Settings.
|
299 |
|
300 |
= 2012.1218 =
|
301 |
|
302 |
-
* WORDPRESS VISUAL EDITOR FIXED. There was an unlisted change in the
|
303 |
-
2012.1212 release which had the effect of disabling the WordPress Visual
|
304 |
-
Editor for all posts syndicated by FeedWordPress. Many users reported
|
305 |
-
this as a bug. It was actually a deliberate decision -- a crappy way to
|
306 |
-
try to deal with a crappy situation. (Many users had previously reported
|
307 |
-
a "bug" in which all the paragraph or line breaks seemed to be stripped
|
308 |
-
out of their syndicated posts; the issue turned out to be that the
|
309 |
-
Visual Editor was stripping out `<p>` and `<br/>` tags on the assumption
|
310 |
-
that the resulting post would be sent through standard WordPress
|
311 |
-
formatting filters. But under default settings, posts syndicated by FWP
|
312 |
-
deliberately bypass WordPress formatting filters.) In any case, this
|
313 |
-
version adopts a more flexible compromise. *If* FeedWordPress is set up
|
314 |
-
to bypass WordPress formatting filters (as it is by default), *then*
|
315 |
-
the Visual Editor will be disabled for syndicated posts (since using it
|
316 |
-
would produce incorrect results). If on the other hand FeedWordPress is
|
317 |
-
set up to expose syndicated posts to WordPress formatting filters (as it
|
318 |
-
usually is for those using the Visual Editor to manually edit posts),
|
319 |
-
then the Visual Editor tab will be re-enabled for syndicated posts.
|
320 |
|
321 |
* BUG FIX: PERMALINKS REWRITTEN FOR CUSTOM POST TYPES AS WELL AS NORMAL
|
322 |
WORDPRESS POSTS. If you had WordPress set up to syndicate incoming posts
|
@@ -2025,120 +1884,42 @@ between version 0.98 of WordPress and the recently released WordPress 2.1.
|
|
2025 |
|
2026 |
= From 0.91 to 0.95 =
|
2027 |
|
2028 |
-
* BUG FIX: Fixed an obscure bug in the handling of categories:
|
2029 |
-
|
2030 |
-
|
2031 |
-
|
2032 |
-
FeedWordPress
|
2033 |
-
|
2034 |
-
* FEATURE
|
2035 |
-
deprecated in favor of `unknown categories` (see below), which
|
2036 |
-
allows you to strip off any syndication categories not already in
|
2037 |
-
your database using `unknown categories: default` or `unknown
|
2038 |
-
categories: filter`. If you have `hardcode categories: yes` set on a
|
2039 |
-
feed, this will be treated as `unknown categories: default` (i.e.,
|
2040 |
-
no new categories will be added, but if a post doesn't match any of
|
2041 |
-
the categories it will be added in the default category--usually
|
2042 |
-
"Uncategorized" or "General").
|
2043 |
-
|
2044 |
-
* FEATURE: You can now set global defaults as to whether or not
|
2045 |
-
FeedWordPress will update the Link Name and Link Description
|
2046 |
-
settings for feeds automatically from the feed title and feed
|
2047 |
-
tagline. (By default, it does, as it has in past versions.) Whether
|
2048 |
-
this behavior is turned on or off, you can still override the
|
2049 |
-
default behavior using feed settings of `hardcode name: yes`,
|
2050 |
-
`hardcode name: no`, `hardcode description: yes`, or `hardcode
|
2051 |
-
description: no`.
|
2052 |
-
|
2053 |
-
* FEATURE: Users can now provide one or several "aliases" for an
|
2054 |
-
author, just as they can for a category. For example, to make
|
2055 |
-
FeedWordPress treat posts by "Joseph Cardinal Ratzinger" and "Pope
|
2056 |
-
Benedict XVI" as by the same author, edit the user profile for Pope
|
2057 |
-
Benedict XVI and add a line like this to the "User profile" field:
|
2058 |
|
2059 |
a.k.a.: Joseph Cardinal Ratzinger
|
2060 |
|
2061 |
-
You can add several aliases, each on a line by itself. You can also
|
2062 |
-
|
2063 |
-
the
|
2064 |
-
|
2065 |
-
|
2066 |
-
|
2067 |
-
categories
|
2068 |
-
|
2069 |
-
|
2070 |
-
future posts. This behavior can be changed, either for all feeds or
|
2071 |
-
for one or another particular feed.
|
2072 |
-
|
2073 |
-
There are now three different options for an unfamiliar author: (1)
|
2074 |
-
FeedWordPress can create a new author account and attribute the
|
2075 |
-
syndicated post to the new account; (2) FeedWordPress can attribute
|
2076 |
-
the post to an author if the author's name is familiar, and to a
|
2077 |
-
default author (currently, this means the Site Administrator
|
2078 |
-
account) if it is not; (3) FeedWordPress can drop posts by
|
2079 |
-
unfamiliar authors and syndicate only posts by authors who are
|
2080 |
-
already in the database.
|
2081 |
-
|
2082 |
-
There are, similarly, two different options for an unfamiliar
|
2083 |
-
category: (1) FeedWordPress can create new categories and place the
|
2084 |
-
syndicated post in them; (2) FeedWordPress can drop the unfamiliar
|
2085 |
-
categories and place syndicated posts only in categories that it is
|
2086 |
-
already familiar with. In addition, FeedWordPress 0.95 lets you
|
2087 |
-
choose whether posts that are in *no* familiar categories should be
|
2088 |
-
syndicated (and placed in the default category for the blog) or
|
2089 |
-
simply dropped.
|
2090 |
-
|
2091 |
-
You can set the default behavior for both authors and categories
|
2092 |
-
using the settings in Options --> Syndication. You can also set
|
2093 |
-
different behavior for specific feeds by adding the `unfamiliar
|
2094 |
-
author` and / or `unfamiliar categories` settings to the Link Notes
|
2095 |
-
section of a feed:
|
2096 |
|
2097 |
unfamiliar author: (create|default|filter)
|
2098 |
unfamiliar categories: (create|default|filter)
|
2099 |
|
2100 |
-
A setting of `unfamiliar author: create` will make FeedWordPress
|
2101 |
-
|
2102 |
-
|
2103 |
-
|
2104 |
-
|
2105 |
-
this feed alone) to be dropped unless they are by an author already
|
2106 |
-
listed in the database. Similiarly, `unfamiliar categories: create`
|
2107 |
-
will make FeedWordPress create new categories to match unfamiliar
|
2108 |
-
category names *for this feed alone*; `unfamiliar categories:
|
2109 |
-
default` will cause it to drop any unfamiliar category names; and
|
2110 |
-
`unfamiliar categories: filter` will cause it to *both* drop any
|
2111 |
-
unfamiliar category names *and* to only syndicate posts that are
|
2112 |
-
placed in one or more familiar categories.
|
2113 |
-
|
2114 |
-
These two new features allow users to do some coarse-grained
|
2115 |
-
filtering without having to write a PHP filter. Specifically, they
|
2116 |
-
offer an easy way for you to filter feeds by category or by author.
|
2117 |
-
Suppose, for example, that you only wanted to syndicate posts that
|
2118 |
-
your contributors place in the "Llamas" category. You could do so by
|
2119 |
-
setting up your installation of WordPress so that the only category
|
2120 |
-
in the database is "Llamas," and then use Options --> Syndication to
|
2121 |
-
set "Unfamiliar categories" to "don't create new categories and
|
2122 |
-
don't syndicate posts unless they match at least one familiar
|
2123 |
-
category". Now, when you update, only posts in the "Llamas" category
|
2124 |
-
will be syndicated by FeedWordPress.
|
2125 |
-
|
2126 |
-
Similarly, if you wanted to filter one particular feed so that only
|
2127 |
-
posts by (for example) the author "Earl J. Llama" were syndicated to
|
2128 |
-
your site, you could do so by creating a user account for Earl J.
|
2129 |
-
Llama, then adding the following line to the settings for the feed
|
2130 |
-
in Link Notes:
|
2131 |
|
2132 |
unfamiliar author: filter
|
2133 |
|
2134 |
-
This will cause any posts from this feed that are not authored by
|
2135 |
-
Earl J. Llama to be discarded, and only the posts by Earl J. Llama
|
2136 |
-
will be syndicated. (If the setting is used on one specific feed, it
|
2137 |
-
will not affect how posts from other feeds are syndicated.)
|
2138 |
|
2139 |
== License ==
|
2140 |
|
2141 |
-
The FeedWordPress plugin is copyright © 2005-
|
2142 |
code derived or translated from:
|
2143 |
|
2144 |
- [wp-rss-aggregate.php][] by [Kellan Elliot-McCrea](kellan@protest.net)
|
1 |
=== FeedWordPress ===
|
2 |
+
Contributors: C. Johnson
|
3 |
Donate link: http://feedwordpress.radgeek.com/
|
4 |
Tags: syndication, aggregation, feed, atom, rss
|
5 |
Requires at least: 4.5
|
6 |
Tested up to: 4.8.2
|
7 |
+
Stable tag: 2017.1020
|
8 |
|
9 |
FeedWordPress syndicates content from feeds you choose into your WordPress weblog.
|
10 |
|
11 |
== Description ==
|
12 |
|
13 |
+
* Author: [C. Johnson](http://feedback.radgeek.com/contact)
|
14 |
* Project URI: <http://feedwordpress.radgeek.com/>
|
15 |
* License: GPL 2. See License below for copyright jots and tittles.
|
16 |
|
17 |
+
FeedWordPress is an Atom/RSS aggregator for WordPress. It syndicates content from feeds that you choose into your WordPress weblog, and then the content it syndicates appears as a series of special posts in your WordPress posts database. If you syndicate several feeds then you can use WordPress's posts database and templating engine as the back-end of an aggregation ("planet") website. It was developed, originally, as a utility/hobby project, because I needed a more flexible replacement for [Planet][] for aggregator sites that I administered.
|
|
|
|
|
|
|
|
|
|
|
|
|
18 |
|
19 |
[Planet]: http://www.planetplanet.org/
|
20 |
|
21 |
+
FeedWordPress is designed with flexibility, ease of use, and ease of configuration in mind. You'll need a working installation of WordPress (version [4.5][] or later), and it helps to have SFTP or FTP access to your web host. The ability to create cron jobs on your web host is helpful but not required.
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
[WordPress]: http://wordpress.org/
|
24 |
[WordPress MU]: http://mu.wordpress.org/
|
25 |
+
[4.5]: http://codex.wordpress.org/Version_4.5
|
26 |
|
27 |
== Installation ==
|
28 |
|
29 |
To use FeedWordPress, you will need:
|
30 |
|
31 |
+
* an installed and configured copy of [WordPress][] (version 4.5 or later).
|
|
|
32 |
|
33 |
+
* the ability to install new plugins on your site using either WordPress's Plugins Repository, SFTP, FTP or shell access to your web host
|
34 |
|
35 |
= New Installations =
|
36 |
|
37 |
+
1. Download the FeedWordPress installation package and extract the files on your computer.
|
|
|
38 |
|
39 |
+
2. Create a new directory named `feedwordpress` in the `wp-content/plugins` directory of your WordPress installation. Use an FTP or SFTP client to upload the contents of your FeedWordPress archive to the new directory that you just created on your web host.
|
|
|
|
|
|
|
40 |
|
41 |
3. Log in to the WordPress Dashboard and activate the FeedWordPress plugin.
|
42 |
|
43 |
+
4. Once the plugin is activated, a new **Syndication** section should appear in your WordPress admin menu. Click here to add new syndicated feeds, set up configuration options, and determine how FeedWordPress will check for updates. For help, see the [FeedWordPress Quick Start][] page.
|
|
|
|
|
|
|
|
|
44 |
|
45 |
[FeedWordPress Quick Start]: http://feedwordpress.radgeek.com/wiki/quick-start
|
46 |
|
47 |
= Upgrades =
|
48 |
|
49 |
+
To *upgrade* an existing installation of FeedWordPress to the most recent release:
|
|
|
50 |
|
51 |
+
1. Download the FeedWordPress installation package and extract the files on your computer.
|
|
|
52 |
|
53 |
+
2. Upload the new PHP files to `wp-content/plugins/feedwordpress`, overwriting any existing FeedWordPress files that are there.
|
|
|
54 |
|
55 |
+
3. Log in to your WordPress administrative interface immediately in order to see whether there are any further tasks that you need to perform to complete the upgrade.
|
|
|
|
|
56 |
|
57 |
4. Enjoy your newer and hotter installation of FeedWordPress
|
58 |
|
59 |
== Using and Customizing FeedWordPress ==
|
60 |
|
61 |
+
FeedWordPress has many options which can be accessed through the WordPress Dashboard, and a lot of functionality accessible programmatically through WordPress templates or plugins. For further documentation of the ins and outs, see the documentation at the [FeedWordPress project homepage][].
|
|
|
|
|
|
|
62 |
|
63 |
[FeedWordPress project homepage]: http://feedwordpress.radgeek.com/
|
64 |
|
65 |
== Changelog ==
|
66 |
|
67 |
+
= 2017.1020 =
|
68 |
+
|
69 |
+
* ADD BOILERPLATE / CREDITS FEATURE AVAILABLE IN POSTS & LINKS SETTINGS PANEL. I have added a new settings panel to the off-the-shelf features of FeedWordPress, under Syndication > Posts & Links (or under the Posts settings page for any individual feed), which allows you to define boilerplate text that should appear in connection with every syndicated post, or with every post syndicated from a particular feed. So, for example, if you want each syndicated post to include a byline reading "This is a syndicated post, reprinted from (LINK TO ORIGINAL SOURCE WEBSITE).", you could set up this byline from within the FeedWordPress settings interface, by going to the Boilerplate / Credits panel, and adding a line to appear BEFORE the CONTENT of each syndicated post, using the text and shortcode "This is a syndicated post, reprinted from [source]." For those of you who have corresponded with me about this feature before, you may be familiar with it from the long-standing "experimental" add-on, FWP+: Add Attribution; I've decided that it's been enough years, and I've had enough requests, that the Add Attribution feature may as well be included in the main FeedWordPress code.
|
70 |
+
|
71 |
+
Back when FeedWordPress was first created, the assumption was that a well-behaved aggregator would include boilerplate text to indicate the source of syndicated posts, but that the best way to do this was to provide a set of syndication-specific template tags so that the administrator setting up the site could edit their Theme template files with constructs like:
|
72 |
+
|
73 |
+
<?php if (is_syndicated()) : ?>
|
74 |
+
<p class="byline">This post by <?php the_author(); ?> originally
|
75 |
+
appeared at <a href="<?php the_syndication_source_link(); ?>"><?php
|
76 |
+
the_syndication_source(); ?></a>.</p>
|
77 |
+
<?php else : ?>
|
78 |
+
<p class="byline">By <?php the_author(); ?>.</p>
|
79 |
+
<?php endif; ?>
|
80 |
+
|
81 |
+
You can still do this, of course, and for maximum expressive power and flexibility, it is certainly the best way to do it. Template Tags are documented here: <http://feedwordpress.radgeek.com/wiki/templates/> However, (1) it requires writing PHP code, which not everyone is comfortable doing; and (2) it requires altering template files within your Theme, which is not always possible, especially given the increasing role that prepackaged commercial themes have come to play in the WordPress ecosystem. So, now, you can get some basic features for adding boilerplate text and attribution credits even without touching your template files, and without having to add custom add-ons for FeedWordPress. Enjoy!
|
82 |
+
|
83 |
+
* MINOR CODE MODERNIZATION, PHP 7.1 COMPATIBILITY AND BUG FIXES. This project is now 12+ years old (good lord), and there are still some places where code was written at a time when PHP was a very different language from what it is now. Props to @david-robinson-practiceweb for pointing out and sending a pull request to fix some instances where obsolete PHP reference notation (`&$q` on parameters and so on) created a compatibility problem for PHP 7.1. Props to an email correspondent for pointing out a place in SyndicatedPost where excerpts should be generated from post content using encoding-aware mb_substr(), instead of naively running them through substr(). I've begun making some efforts throughout to begin auditing some of the creakiest old code in the project, to update what needs updating and improve documentation throughout.
|
84 |
+
|
85 |
= 2017.0913 =
|
86 |
|
87 |
+
* PARTIAL FIX FOR 2X DUPLICATE POSTS APPEARING ON DUAL HTTP/HTTPS SITES: Some users reported an issue in which their FeedWordPress sites, which are over both insecure HTTP and over HTTPS, would pick up exactly 2 copies of every post or almost every post from certain feeds, and where the guids for each of the pair of duplicate posts would look exactly alike, except for a difference in the protocol, for example:
|
|
|
|
|
|
|
|
|
|
|
88 |
|
89 |
http://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545
|
90 |
https://www.example.com/?guid=c1cd28da39e8d7babcf6499983aca545
|
91 |
|
92 |
+
... where www.example.com is the server that your own copy of FeedWordPress is installed. This release of FeedWordPress normalizes post guid prefixes so as to avoid or limit the scope of this problem.
|
93 |
+
|
94 |
+
* PHP 7 Compatibility: eliminate remaining sources of PHP 7 compatibility-check failures -- remove the use of depreciated mysql_error() function, and make sure all classes make use of __construct() convention for constructors.
|
95 |
+
|
96 |
+
* AVOID "PHP Warning: shell_exec() has been disabled for security reasons in [...]/feedwordpress/feeds-page.php on line 197": FeedWordPress uses the PHP shell_exec() function in a very narrowly limited way for information gathering, trying to find the real path to curl or wget on your system, so that it can give as realistic as possible a recommendation for the sample crontab line displayed in Syndication > Feeds & Updates. Some web hosting environments disable shell_exec for security reasons (since it could in theory be used to do a lot more stuff than the very limited information gathering FWP uses it for); in which case, this part of the code in FeedWordPress could spit out a nasty-looking and potentially worrisome-looking error message. So, now this code is fenced with checks to make sure that shell_exec is available, before FWP attempts to make use of it.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
97 |
|
98 |
= 2016.1213 =
|
99 |
|
100 |
+
* WORDPRESS BACKWARD COMPATIBILITY FOR VERSIONS [4.5, 4.7]: This change fixes a fatal PHP error (on some web server configurations you'd see the message "Fatal error: require_once(): Failed opening required '[...]/wp-includes/class-wp-feed-cache.php'" on others, you might just see an HTTP 500 Internal Server Error or a blank page) when using FeedWordPress with versions of WordPress before 4.7. A change that I introduced to avoid a code module that had been deprecated in version 4.7 ended up relying on code modules that were only introduced as of version 4.7; so now, instead, FeedWordPress attempts to detect which modules the current version of the WordPress core makes available, and load the right modules depending on your WordPress version.
|
101 |
+
|
102 |
+
In theory, up to this point, FeedWordPress supported any version of WordPress from version 3.0 onward. In practice, version 3.0 was released over 6 years ago, and I can realistically commit only to testing out new releases of FeedWordPress with a few prior versions of WordPress; so I've updated the "Requires at least" field to version 4.5, the first major release issued in 2016. If you've really got to use FeedWordPress with older versions of WordPress, it will probably still work with any moderately modern release of WordPress, but I won't promise to keep it working with releases of WordPress that are more than about a year old.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
103 |
|
104 |
= 2016.1211 =
|
105 |
|
106 |
* WORDPRESS COMPATIBILITY: Tested with new versions of WordPress up to 4.7.
|
107 |
|
108 |
+
* PHP WARNINGS UNDER WP 4.7: Eliminated cause of a PHP warning under WP 4.7 "Parameter 1 to FeedWordPressHTTPAuthenticator::set_auth_options expected to be reference" Warnings were due to a change in how http_api_curl hook is sometimes called in WP 4.7; so I changed the signature of the event handling method to avoid the notice. Props to @cogdog, @froomkin, @gwynethllewelyn et al. for flagging the issue and @garymarkfuller for suggesting a preliminary fix to the issue that was fairly similar to the solution I ended up adopting.
|
109 |
+
|
110 |
+
* PHP 7 and PHP Strict Standards compatibility changes: @alexiskulash @daidais and @zoul0813 all sent pull requests through Github to fix some issues from a very old code base that has made its way from PHP 3.x through 5.x to the roll-out of PHP 7. Class methods should now fare better under modern versions of PHP and generate fewer "Deprecated" notices.
|
111 |
+
|
112 |
+
* IMPROVEMENTS TO SCHEDULED AND AUTOMATIC UPDATES: use wp_loaded hook to check for magic URL parameters and to execute updates, to do pageload-based automatic updates, etc. Ensures that anything plugins or themes need to do in init to set up custom post types, taxonomies, etc. will be done before the update_feedwordpress updates are attempted. If you saw posts not getting put into the correct custom post type or custom taxonomies or similar problems when performing scheduled updates, but the problem seemed to go away when you manually performed updates through the wp-admin interface, then you might be able to solve those problems with this update.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
113 |
|
114 |
= 2016.0420 =
|
115 |
|
116 |
* WORDPRESS COMPATIBILITY: Tested with new versions of WordPress up to 4.5.
|
117 |
|
118 |
+
* FILTERS AND ADD-ONS: Allow filters and add-ons to filter terms and taxonomy (categories, tags, custom taxonomies, etc.) more thoroughly and more fine-grainedly using syndicated_post_terms_match, syndicated_post_terms_match_{taxonomy}, syndicated_post_terms_unfamiliar, syndicated_post_terms_mapping, syndicated_item_feed_terms, and syndicated_item_preset_terms filters.
|
119 |
+
|
120 |
+
* FILTERS AND ADD-ONS: Globals $fwp_channel and $fwp_feedmeta REMOVED. These global variables, originally introduced to allow filters access to information about the source feed in `syndicated_item` filters were deprecated 6+ years ago. If you have any filters or add-ons which still depend on these global variables, you've been using obsolete techniques and you should see about fixing them to access data about the source feed using the SyndicatedPost::link element instead. For documentation, see the FeedWordPress documentation wiki at <http://feedwordpress.radgeek.com/wiki/syndicatedpost> and <http://feedwordpress.radgeek.com/wiki/syndicatedlink>.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
|
122 |
+
* BUGFIX: Syndication > Diagnostics HTTP diagnostic test widget was broken due to a dumb error on my part. Now fixed.
|
|
|
123 |
|
124 |
+
* SMALL CODING CHANGES: Lots of small changes to code organization, incorporation of some PHP 5.x coding conventions, etc.
|
|
|
125 |
|
126 |
= 2015.0514 =
|
127 |
|
128 |
+
* IMPORTANT SECURITY UPDATE: This version includes two important fixes for potential security vulnerabilities reported to me through support channels.
|
129 |
+
|
130 |
+
The first is a common problem across several plugins due to an ambiguity in the WordPress documentation and a change in the behavior of WordPress's built-in add_query_arg() and remove_query_arg() functions which could, under certain low-probability conditions, allow for potential XSS attack vectors. This fixes issue # 39 reported at <https://github.com/radgeek/feedwordpress/issues/39> Thanks to github.com/quassy
|
131 |
+
|
132 |
+
The second is a security vulnerability fixes a security vulnerability that was reported to me privately (thanks to Adrián M. F.) which, under other low-probability conditions, could allow for SQL insertion attacks by a malicious user with access to login credentials, which would compromise data security.
|
133 |
+
|
134 |
+
It is *IMPORTANT* and worth your while to upgrade FeedWordPress as soon as possible in order to eliminate these vulnerabilities. If you have any questions or if there is something blocking you from making the upgrade which you need my help with, don't hesitate to get in touch.
|
135 |
+
|
136 |
+
* ADMIN UI BUGFIX: "Update Now" button in feeds setting pages should now work once again instead of causing a PHP fatal error. See <https://github.com/radgeek/feedwordpress/issues/46>
|
137 |
+
|
138 |
+
* SEVERAL OTHER SMALL BUG FIXES. See <https://github.com/radgeek/feedwordpress/issues/32> <https://github.com/radgeek/feedwordpress/issues/30> <https://github.com/radgeek/feedwordpress/issues/29> etc.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
139 |
|
140 |
= 2014.0805 =
|
141 |
|
142 |
+
* FILTERS AND ADD-ONS: A number of new hooks for filters and add-ons to further customize the behavior of FWP have been added.
|
|
|
143 |
|
144 |
+
* COMPATIBILITY/BUGFIX: Many users saw odd characters, especially "n," appearing in posts in versions of WordPress from 3.6 on, due to a change in when the API expects HTML data for posts to be slashed and when it does not. This has been fixed, so that the junk characters should no longer appear, regardless of your version of WordPress.
|
|
|
|
|
|
|
|
|
145 |
|
146 |
+
* BUGFIX: A bug preventing FWP from saving categories assigned under Syndication > Categories & Tags has been fixed.
|
|
|
147 |
|
148 |
+
* BUGFIX: Post-editing related metaboxes should now show up when you edit items of any post type, including custom types, not only normal WordPress posts.
|
|
|
|
|
149 |
|
150 |
+
* BUGFIX: A bug in the admin UI that caused the "Alternative Feeds" / "Find Feeds" box to throw a permissions error has been fixed.
|
|
|
151 |
|
152 |
+
* BUGFIX: A bug preventing proper mapping of categories and other terms in 2013.0504 has been fixed.
|
|
|
153 |
|
154 |
+
* BUGFIX: A number of small fixes contributed through Github by Flynsarmy should eliminate PHP warnings for many users on several methods that are called as static methods within FeedWordPress.
|
|
|
|
|
155 |
|
156 |
= 2013.0504 =
|
157 |
|
158 |
+
* BUGFIX: PHP 5.4 compatibility -- includes some more extensive fixes to compatibility issues with PHP 5.4's handling of global variables
|
|
|
159 |
|
160 |
+
* DIAGNOSTICS: New diagnostics settings added to help track behavior of terms (categories, post tags, etc.) for syndicated posts.
|
|
|
161 |
|
162 |
= 2012.0504 =
|
163 |
|
164 |
+
* MODULE REORGANIZATION: Should ensure that all needed submodules will be properly included regardless of whether you are installing from github, from SVN, or from the WordPress plugins page. If you've been getting fatal errors about required modules not being found, this release should hopefully resolve the issue.
|
|
|
|
|
|
|
|
|
165 |
|
166 |
= 2012.0503 =
|
167 |
|
168 |
+
* BUGFIX: Works properly again with WordPress installations that use a MySQL table name prefix other than the default `wp_` prefix.
|
|
|
169 |
|
170 |
+
* BUGFIX: Includes a couple of significant PHP 5.4 compatibility fixes. Now that PHP 5.4 is more widely deployed, Diagnostics will now also show PHP version and some other potentially useful troubleshooting information.
|
|
|
|
|
|
|
171 |
|
172 |
+
* ADMIN UI: Better indicates your options when deleting a syndicated post so as to let you know whether it will be Trashed (and thus not resyndicated) or Erased (and thus potentially resyndicated)
|
|
|
|
|
173 |
|
174 |
+
* ADMIN UI: Adds an AJAXy Test Expression button to allow live testing of sample results from expressions in Custom Post Settings.
|
|
|
175 |
|
176 |
= 2012.1218 =
|
177 |
|
178 |
+
* WORDPRESS VISUAL EDITOR FIXED. There was an unlisted change in the 2012.1212 release which had the effect of disabling the WordPress Visual Editor for all posts syndicated by FeedWordPress. Many users reported this as a bug. It was actually a deliberate decision -- a crappy way to try to deal with a crappy situation. (Many users had previously reported a "bug" in which all the paragraph or line breaks seemed to be stripped out of their syndicated posts; the issue turned out to be that the Visual Editor was stripping out `<p>` and `<br/>` tags on the assumption that the resulting post would be sent through standard WordPress formatting filters. But under default settings, posts syndicated by FWP deliberately bypass WordPress formatting filters.) In any case, this version adopts a more flexible compromise. *If* FeedWordPress is set up to bypass WordPress formatting filters (as it is by default), *then* the Visual Editor will be disabled for syndicated posts (since using it would produce incorrect results). If on the other hand FeedWordPress is set up to expose syndicated posts to WordPress formatting filters (as it usually is for those using the Visual Editor to manually edit posts), then the Visual Editor tab will be re-enabled for syndicated posts.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
179 |
|
180 |
* BUG FIX: PERMALINKS REWRITTEN FOR CUSTOM POST TYPES AS WELL AS NORMAL
|
181 |
WORDPRESS POSTS. If you had WordPress set up to syndicate incoming posts
|
1884 |
|
1885 |
= From 0.91 to 0.95 =
|
1886 |
|
1887 |
+
* BUG FIX: Fixed an obscure bug in the handling of categories: categories with trailing whitespace could cause categories with duplicate names to be created. This no longer happens. While I was at it I tightened up the operation of FeedWordPress::lookup_categories() a bit in general.
|
1888 |
+
|
1889 |
+
* FEATURE DEPRECATED: the feed setting `hardcode categories` is now deprecated in favor of `unknown categories` (see below), which allows you to strip off any syndication categories not already in your database using `unknown categories: default` or `unknown categories: filter`. If you have `hardcode categories: yes` set on a feed, this will be treated as `unknown categories: default` (i.e., no new categories will be added, but if a post doesn't match any of the categories it will be added in the default category--usually "Uncategorized" or "General").
|
1890 |
+
|
1891 |
+
* FEATURE: You can now set global defaults as to whether or not FeedWordPress will update the Link Name and Link Description settings for feeds automatically from the feed title and feed tagline. (By default, it does, as it has in past versions.) Whether this behavior is turned on or off, you can still override the default behavior using feed settings of `hardcode name: yes`, `hardcode name: no`, `hardcode description: yes`, or `hardcode description: no`.
|
1892 |
+
|
1893 |
+
* FEATURE: Users can now provide one or several "aliases" for an author, just as they can for a category. For example, to make FeedWordPress treat posts by "Joseph Cardinal Ratzinger" and "Pope Benedict XVI" as by the same author, edit the user profile for Pope Benedict XVI and add a line like this to the "User profile" field:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1894 |
|
1895 |
a.k.a.: Joseph Cardinal Ratzinger
|
1896 |
|
1897 |
+
You can add several aliases, each on a line by itself. You can also add any other text you like to the Profile without interfering with the aliases.
|
1898 |
+
|
1899 |
+
* FEATURE: Users can now choose how to handle syndicated posts that are in unfamiliar categories or by unfamiliar authors (i.e., categories or authors whose names are not yet in the WordPress database). By default, FeedWordPress will (as before) create a new category (or new author) and use it for the current post and any future posts. This behavior can be changed, either for all feeds or for one or another particular feed.
|
1900 |
+
|
1901 |
+
There are now three different options for an unfamiliar author: (1) FeedWordPress can create a new author account and attribute the syndicated post to the new account; (2) FeedWordPress can attribute the post to an author if the author's name is familiar, and to a default author (currently, this means the Site Administrator account) if it is not; (3) FeedWordPress can drop posts by unfamiliar authors and syndicate only posts by authors who are already in the database.
|
1902 |
+
|
1903 |
+
There are, similarly, two different options for an unfamiliar category: (1) FeedWordPress can create new categories and place the syndicated post in them; (2) FeedWordPress can drop the unfamiliar categories and place syndicated posts only in categories that it is already familiar with. In addition, FeedWordPress 0.95 lets you choose whether posts that are in *no* familiar categories should be syndicated (and placed in the default category for the blog) or simply dropped.
|
1904 |
+
|
1905 |
+
You can set the default behavior for both authors and categories using the settings in Options --> Syndication. You can also set different behavior for specific feeds by adding the `unfamiliar author` and / or `unfamiliar categories` settings to the Link Notes section of a feed:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1906 |
|
1907 |
unfamiliar author: (create|default|filter)
|
1908 |
unfamiliar categories: (create|default|filter)
|
1909 |
|
1910 |
+
A setting of `unfamiliar author: create` will make FeedWordPress create new authors to match unfamiliar author names *for this feed alone*. A setting of `unfamiliar author: default` will make it assign posts from unfamiliar authors to the default user account. A setting of `unfamiliar author: filter` will cause all posts (from this feed alone) to be dropped unless they are by an author already listed in the database. Similiarly, `unfamiliar categories: create` will make FeedWordPress create new categories to match unfamiliar category names *for this feed alone*; `unfamiliar categories: default` will cause it to drop any unfamiliar category names; and `unfamiliar categories: filter` will cause it to *both* drop any unfamiliar category names *and* to only syndicate posts that are placed in one or more familiar categories.
|
1911 |
+
|
1912 |
+
These two new features allow users to do some coarse-grained filtering without having to write a PHP filter. Specifically, they offer an easy way for you to filter feeds by category or by author. Suppose, for example, that you only wanted to syndicate posts that your contributors place in the "Llamas" category. You could do so by setting up your installation of WordPress so that the only category in the database is "Llamas," and then use Options --> Syndication to set "Unfamiliar categories" to "don't create new categories and don't syndicate posts unless they match at least one familiar category". Now, when you update, only posts in the "Llamas" category will be syndicated by FeedWordPress.
|
1913 |
+
|
1914 |
+
Similarly, if you wanted to filter one particular feed so that only posts by (for example) the author "Earl J. Llama" were syndicated to your site, you could do so by creating a user account for Earl J. Llama, then adding the following line to the settings for the feed in Link Notes:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1915 |
|
1916 |
unfamiliar author: filter
|
1917 |
|
1918 |
+
This will cause any posts from this feed that are not authored by Earl J. Llama to be discarded, and only the posts by Earl J. Llama will be syndicated. (If the setting is used on one specific feed, it will not affect how posts from other feeds are syndicated.)
|
|
|
|
|
|
|
1919 |
|
1920 |
== License ==
|
1921 |
|
1922 |
+
The FeedWordPress plugin is copyright © 2005-2017 by Charles Johnson. It uses
|
1923 |
code derived or translated from:
|
1924 |
|
1925 |
- [wp-rss-aggregate.php][] by [Kellan Elliot-McCrea](kellan@protest.net)
|
@@ -12,7 +12,7 @@ require_once(dirname(__FILE__).'/syndicatedpostxpathquery.class.php');
|
|
12 |
* different feed formats, which may be useful to FeedWordPress users
|
13 |
* who make use of feed data in PHP add-ons and filters.
|
14 |
*
|
15 |
-
* @version 2017.
|
16 |
*/
|
17 |
class SyndicatedPost {
|
18 |
var $item = null; // MagpieRSS representation
|
@@ -43,10 +43,10 @@ class SyndicatedPost {
|
|
43 |
* @param array $item The item syndicated from the feed.
|
44 |
* @param SyndicatedLink $source The feed it was syndicated from.
|
45 |
*/
|
46 |
-
function __construct ($item,
|
47 |
global $wpdb;
|
48 |
|
49 |
-
if ( empty($item)
|
50 |
return;
|
51 |
|
52 |
if (is_array($item)
|
@@ -68,7 +68,7 @@ class SyndicatedPost {
|
|
68 |
$this->item = $item;
|
69 |
endif;
|
70 |
|
71 |
-
$this->link
|
72 |
$this->feed = $source->magpie;
|
73 |
$this->feedmeta = $source->settings;
|
74 |
|
@@ -290,7 +290,7 @@ class SyndicatedPost {
|
|
290 |
* @returns array of string values representing contents of matching
|
291 |
* elements or attributes
|
292 |
*/
|
293 |
-
function query ($path) {
|
294 |
$xq = new SyndicatedPostXPathQuery(array("path" => $path));
|
295 |
|
296 |
$feedChannel = array_merge(
|
@@ -342,15 +342,15 @@ class SyndicatedPost {
|
|
342 |
return $matches;
|
343 |
} /* SyndicatedPost::get_feed_channel_elements() */
|
344 |
|
345 |
-
function get_categories ($params = array()) {
|
346 |
return $this->entry->get_categories();
|
347 |
}
|
348 |
|
349 |
-
function title ($params = array()) {
|
350 |
return $this->entry->get_title();
|
351 |
} /* SyndicatedPost::title () */
|
352 |
|
353 |
-
function content ($params = array()) {
|
354 |
|
355 |
$params = wp_parse_args($params, array(
|
356 |
"full only" => false,
|
@@ -402,7 +402,7 @@ class SyndicatedPost {
|
|
402 |
return $content;
|
403 |
} /* SyndicatedPost::content() */
|
404 |
|
405 |
-
function excerpt () {
|
406 |
# Identify and sanitize excerpt: atom:summary, or rss:description
|
407 |
$excerpt = $this->entry->get_description();
|
408 |
|
@@ -433,14 +433,20 @@ class SyndicatedPost {
|
|
433 |
return $excerpt;
|
434 |
} /* SyndicatedPost::excerpt() */
|
435 |
|
436 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
437 |
// Handles explicit <link> elements and also RSS 2.0 cases with
|
438 |
// <guid isPermaLink="true">, etc. Hooray!
|
439 |
$permalink = $this->entry->get_link();
|
440 |
return $permalink;
|
441 |
-
}
|
442 |
|
443 |
-
function created ($params = array()) {
|
444 |
$unfiltered = false; $default = NULL;
|
445 |
extract($params);
|
446 |
|
@@ -461,7 +467,7 @@ class SyndicatedPost {
|
|
461 |
return $ts;
|
462 |
} /* SyndicatedPost::created() */
|
463 |
|
464 |
-
function published ($params = array(), $default = NULL) {
|
465 |
$fallback = true; $unfiltered = false;
|
466 |
if (!is_array($params)) : // Old style
|
467 |
$fallback = $params;
|
@@ -510,7 +516,7 @@ class SyndicatedPost {
|
|
510 |
return $ts;
|
511 |
} /* SyndicatedPost::published() */
|
512 |
|
513 |
-
function updated ($params = array(), $default = -1) {
|
514 |
$fallback = true; $unfiltered = false;
|
515 |
if (!is_array($params)) : // Old style
|
516 |
$fallback = $params;
|
@@ -636,7 +642,7 @@ class SyndicatedPost {
|
|
636 |
return $guid;
|
637 |
} /* SyndicatedPost::normalize_guid() */
|
638 |
|
639 |
-
function guid () {
|
640 |
$guid = null;
|
641 |
if (isset($this->item['id'])): // Atom 0.3 / 1.0
|
642 |
$guid = $this->item['id'];
|
@@ -695,7 +701,7 @@ class SyndicatedPost {
|
|
695 |
return $guid;
|
696 |
} /* SyndicatedPost::guid() */
|
697 |
|
698 |
-
function author () {
|
699 |
$author = array ();
|
700 |
|
701 |
$aa = $this->entry->get_authors();
|
12 |
* different feed formats, which may be useful to FeedWordPress users
|
13 |
* who make use of feed data in PHP add-ons and filters.
|
14 |
*
|
15 |
+
* @version 2017.1018
|
16 |
*/
|
17 |
class SyndicatedPost {
|
18 |
var $item = null; // MagpieRSS representation
|
43 |
* @param array $item The item syndicated from the feed.
|
44 |
* @param SyndicatedLink $source The feed it was syndicated from.
|
45 |
*/
|
46 |
+
public function __construct ($item, $source) {
|
47 |
global $wpdb;
|
48 |
|
49 |
+
if ( empty($item) and empty($source) )
|
50 |
return;
|
51 |
|
52 |
if (is_array($item)
|
68 |
$this->item = $item;
|
69 |
endif;
|
70 |
|
71 |
+
$this->link = $source;
|
72 |
$this->feed = $source->magpie;
|
73 |
$this->feedmeta = $source->settings;
|
74 |
|
290 |
* @returns array of string values representing contents of matching
|
291 |
* elements or attributes
|
292 |
*/
|
293 |
+
public function query ($path) {
|
294 |
$xq = new SyndicatedPostXPathQuery(array("path" => $path));
|
295 |
|
296 |
$feedChannel = array_merge(
|
342 |
return $matches;
|
343 |
} /* SyndicatedPost::get_feed_channel_elements() */
|
344 |
|
345 |
+
public function get_categories ($params = array()) {
|
346 |
return $this->entry->get_categories();
|
347 |
}
|
348 |
|
349 |
+
public function title ($params = array()) {
|
350 |
return $this->entry->get_title();
|
351 |
} /* SyndicatedPost::title () */
|
352 |
|
353 |
+
public function content ($params = array()) {
|
354 |
|
355 |
$params = wp_parse_args($params, array(
|
356 |
"full only" => false,
|
402 |
return $content;
|
403 |
} /* SyndicatedPost::content() */
|
404 |
|
405 |
+
public function excerpt () {
|
406 |
# Identify and sanitize excerpt: atom:summary, or rss:description
|
407 |
$excerpt = $this->entry->get_description();
|
408 |
|
433 |
return $excerpt;
|
434 |
} /* SyndicatedPost::excerpt() */
|
435 |
|
436 |
+
/**
|
437 |
+
* SyndicatedPost::permalink: returns the permalink for the post, as provided by the
|
438 |
+
* source feed.
|
439 |
+
*
|
440 |
+
* @return string The URL of the original permalink for this syndicated post
|
441 |
+
*/
|
442 |
+
public function permalink () {
|
443 |
// Handles explicit <link> elements and also RSS 2.0 cases with
|
444 |
// <guid isPermaLink="true">, etc. Hooray!
|
445 |
$permalink = $this->entry->get_link();
|
446 |
return $permalink;
|
447 |
+
} /* SyndicatedPost::permalink () */
|
448 |
|
449 |
+
public function created ($params = array()) {
|
450 |
$unfiltered = false; $default = NULL;
|
451 |
extract($params);
|
452 |
|
467 |
return $ts;
|
468 |
} /* SyndicatedPost::created() */
|
469 |
|
470 |
+
public function published ($params = array(), $default = NULL) {
|
471 |
$fallback = true; $unfiltered = false;
|
472 |
if (!is_array($params)) : // Old style
|
473 |
$fallback = $params;
|
516 |
return $ts;
|
517 |
} /* SyndicatedPost::published() */
|
518 |
|
519 |
+
public function updated ($params = array(), $default = -1) {
|
520 |
$fallback = true; $unfiltered = false;
|
521 |
if (!is_array($params)) : // Old style
|
522 |
$fallback = $params;
|
642 |
return $guid;
|
643 |
} /* SyndicatedPost::normalize_guid() */
|
644 |
|
645 |
+
public function guid () {
|
646 |
$guid = null;
|
647 |
if (isset($this->item['id'])): // Atom 0.3 / 1.0
|
648 |
$guid = $this->item['id'];
|
701 |
return $guid;
|
702 |
} /* SyndicatedPost::guid() */
|
703 |
|
704 |
+
public function author () {
|
705 |
$author = array ();
|
706 |
|
707 |
$aa = $this->entry->get_authors();
|