Posts & Links,
* Syndication > Feeds & Updates, etc., whether for setting global defaults, or for
* settings on particular feeds.
*
*/
class FeedWordPressAdminPage {
protected $context;
protected $updated = false;
protected $mesg = NULL;
/** @var SyndicatedLink|null An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings. */
var $link = NULL;
var $dispatch = NULL;
var $filename = NULL;
var $pagenames = array();
var $boxes_by_methods = array(); // did I delete this by mistake? (gwyneth 20230920)
/**
* Construct the admin page object.
*
* @param mixed $link An object of class {@link SyndicatedLink} if created for one feed's settings, NULL if created for global default settings.
*/
public function __construct( $page = 'feedwordpressadmin', $link = NULL ) {
$this->link = $link;
// Set meta-box context name
$this->context = $page;
if ( $this->for_feed_settings() ) :
$this->context .= 'forfeed';
endif;
} /* FeedWordPressAdminPage constructor */
public function pageslug () {
$slug = preg_replace('/FeedWordPress(.*)Page/', '$1', get_class($this));
return strtolower($slug);
}
public function pagename ($context = NULL) {
if (is_null($context)) :
$context = 'default';
endif;
if (isset($this->pagenames[$context])) :
$name = $this->pagenames[$context];
elseif (isset($this->pagenames['default'])) :
$name = $this->pagenames['default'];
else :
$name = $this->pageslug();
endif;
return __($name);
} /* FeedWordPressAdminPage::pagename () */
public function accept_POST () {
if ( $this->for_feed_settings() and $this->update_requested() ) :
$this->update_feed();
elseif ($this->save_requested()) : // User mashed Save Changes
$this->save_settings();
endif;
do_action($this->dispatch.'_post', null, $this);
}
public function update_feed() {
global $feedwordpress;
add_action('feedwordpress_check_feed', 'update_feeds_mention');
add_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
$link = $this->link;
print '
';
print "
";
$uri = $this->link->uri();
$displayUrl = $uri;
// check for effects of an effective-url filter
$effectiveUrl = $link->uri(array('fetch' => true));
if ($uri != $effectiveUrl) : $displayUrl .= ' | ' . $effectiveUrl; endif;
$delta = $feedwordpress->update($uri);
print "
";
if ( !is_null($delta)) :
echo "
Update complete.".esc_html( fwp_update_set_results_message($delta) )."
";
echo "\n"; flush();
else :
$effectiveUrl = esc_html($effectiveUrl);
echo '
Error: There was a problem updating ' . esc_html( $displayUrl ) . '
' . "\n";
endif;
print "
\n";
remove_action('feedwordpress_check_feed', 'update_feeds_mention');
remove_action('feedwordpress_check_feed_complete', 'update_feeds_finish', 10, 3);
}
public function save_settings () {
do_action($this->dispatch.'_save', null, $this);
if ($this->for_feed_settings()) :
// Save settings
$this->link->save_settings(/*reload=*/ true);
$this->updated = true;
// Reset, reload
$link_id = $this->link->id;
unset($this->link);
$this->link = new SyndicatedLink($link_id);
else :
$this->updated = true;
endif;
} /* FeedWordPressAdminPage::save_settings () */
public function for_feed_settings() {
return ( is_object( $this->link ) and method_exists( $this->link, 'found' ) and $this->link->found() );
} /* FeedWordPressAdminPage */
public function for_default_settings () {
return ! $this->for_feed_settings();
} /* FeedWordPressAdminPage */
/**
* Attempts to retrieve a setting for a feed.
*
* @param string|array $names Either a string with the name of the feed,
* or an associative array where the 'feed' parameter
* indicates the feed.
* @param string|null $fallback_value Fallback option value, if everything fails.
* @param Array $params List of attributes.
*
* @return mixed Retrieved option from settings.
*/
public function setting( $names, $fallback_value = NULL, $params = array() ) {
if ( ! is_array( $params ) ) :
$params = array( 'default' => $params );
endif;
$params = shortcode_atts( array(
'default' => 'default',
'fallback' => true,
),
$params );
if ( is_string( $names ) ) :
$feed_name = $names;
$global_name = 'feedwordpress_' . preg_replace( '![\s/]+!', '_', $names );
else :
$feed_name = $names['feed'];
$global_name = 'feedwordpress_' . $names['global'];
endif;
if ( $this->for_feed_settings() ) : // Check feed-specific setting first; fall back to global
if ( ! $params['fallback'] ) :
$global_name = NULL;
endif;
$ret = $this->link->setting( $feed_name, $global_name, $fallback_value, $params['default'] );
else : // Check global setting
$ret = get_option( $global_name, $fallback_value );
endif;
return $ret;
} /* FeedWordPressAdminPage::setting() */
/**
* Updates feed settings.
*
* @see setting()
*
* @param string|array $names Either a string with the name of the feed,
* or an associative array where the 'global' parameter
* indicates the feed.
* @param string|null $value Setting value to update.
* @param string $default Setting default option (defaults to 'default').
*/
public function update_setting( $names, $value, $default = 'default' ) {
if ( is_string( $names ) ) :
$feed_name = $names;
$global_name = 'feedwordpress_' . preg_replace( '![\s/]+!', '_', $names );
else :
$feed_name = $names['feed'];
$global_name = 'feedwordpress_' . $names['global'];
endif;
if ( $this->for_feed_settings() ) : // Update feed-specific setting
$this->link->update_setting( $feed_name, $value, $default );
else : // Update global setting
update_option( $global_name, $value );
endif;
} /* FeedWordPressAdminPage::update_setting() */
public function save_requested() {
return ! ( is_null( MyPHP::post('save') ) && is_null( MyPHP::post('submit') ) );
}
public function update_requested() {
return ( strlen( MyPHP::post('update', '') ) > 0 );
}
public function submitted_link_id() {
// Presume global unless we get a specific link ID
$link_id = NULL;
$submit_buttons = array(
'save',
'submit',
'fix_mismatch',
'feedfinder',
);
foreach ($submit_buttons as $field) :
if ( ! is_null( MyPHP::request($field) ) ) :
$link_id = sanitize_text_field( MyPHP::request('save_link_id') );
endif;
endforeach;
if ( is_null($link_id) ) :
$link_id = sanitize_text_field( MyPHP::request( 'link_id' ) );
endif;
return $link_id;
} /* FeedWordPressAdminPage::submitted_link_id() */
public function submitted_link () {
$link_id = $this->submitted_link_id();
if (is_numeric($link_id) and $link_id) :
$link = new SyndicatedLink($link_id);
else :
$link = NULL;
endif;
return $link;
} /* FeedWordPressAdminPage::submitted_link () */
public function stamp_link_id ($field = null) {
if (is_null($field)) : $field = 'save_link_id'; endif;
?>
These settings affect posts syndicated from any feed unless they are overridden
by settings for that specific feed.
filename);
endif;
return $this->admin_page_href($filename);
} /* FeedWordPressAdminPage::form_action () */
public function update_message () {
return $this->mesg;
}
public function display () {
if (FeedWordPress::needs_upgrade()) :
fwp_upgrade_page();
return;
endif;
FeedWordPressCompatibility::validate_http_request(/*action=*/ $this->dispatch, /*capability=*/ 'manage_links');
////////////////////////////////////////////////
// Process POST request, if any ////////////////
////////////////////////////////////////////////
if (strtoupper($_SERVER['REQUEST_METHOD'])=='POST') :
$this->accept_POST();
else :
$this->updated = false;
endif;
////////////////////////////////////////////////
// Prepare settings page ///////////////////////
////////////////////////////////////////////////
$this->display_update_notice_if_updated(
$this->pagename('settings-update'),
$this->update_message()
);
$this->open_sheet($this->pagename('open-sheet'));
?>
boxes_by_methods as $method => $row) :
if (is_array($row)) :
$id = $row['id'];
$title = $row['title'];
else :
$id = 'feedwordpress_'.$method;
$title = $row;
endif;
add_meta_box(
/*id=*/ $id,
/*title=*/ $title,
/*callback=*/ array($this, $method),
/*screen=*/ $this->meta_box_context(),
/*context=*/ $this->meta_box_context(),
);
endforeach;
do_action($this->dispatch.'_meta_boxes', $this);
?>
meta_box_context(), $this->meta_box_context(), $this );
?>
close_sheet(); ?>
filename),
/*callback=*/ array($this, 'fix_toggles'),
/*priority=*/ 10000
);
FeedWordPressSettingsUI::ajax_nonce_fields();
?>
display_sheet_header($header);
endif;
if ( !is_null( $this->dispatch ) ) :
?>
\n";
endif;
?>
basename($this->filename),
'site-wide-url' => null,
'setting-default' => null,
'global-setting-default' => null,
'offer-site-wide' => null,
)
);
$filename = $params['filename'];
$href = $params['site-wide-url'];
if ( is_null( $href ) ) :
$href = $this->admin_page_href( $filename );
endif;
$settingDefault = $params['setting-default'];
$globalSettingDefault = $params['global-setting-default'];
if ( is_null( $globalSettingDefault ) ) :
$globalSettingDefault = $settingDefault;
endif;
$globalSetting = get_option('feedwordpress_'.$globalName, $globalSettingDefault);
if ( $this->for_feed_settings() ) :
$setting = $this->link->setting($localName, NULL, $settingDefault);
else :
$setting = $globalSetting;
endif;
$offerSiteWide = $params['offer-site-wide'];
if ( is_null( $offerSiteWide ) ) :
$offerSiteWide = $this->for_feed_settings();
endif;
// This allows us to provide an alternative set of human-readable
// labels for each potential value. For use in Currently: line.
if (isset($params['labels'])) : $labels = $params['labels'];
elseif (is_callable($options)) : $labels = NULL;
else : $labels = $options;
endif;
if (isset($params['input-name'])) : $inputName = $params['input-name'];
else : $inputName = $globalName;
endif;
if (isset($params['default-input-id'])) : $defaultInputId = $params['default-input-id'];
else : $defaultInputId = NULL;
endif;
if (isset($params['default-input-id-no'])) : $defaultInputIdNo = $params['default-input-id-no'];
elseif ( !is_null($defaultInputId)) : $defaultInputIdNo = $defaultInputId.'-no';
else : $defaultInputIdNo = NULL;
endif;
// This allows us to either include the site-default setting as
// one of the options within the radio box, or else as a simple
// yes/no toggle that controls whether or not to check another
// set of inputs.
if (isset($params['default-input-name'])) : $defaultInputName = $params['default-input-name'];
else : $defaultInputName = $inputName;
endif;
if ($defaultInputName != $inputName) :
$defaultInputValue = 'yes';
else :
$defaultInputValue = (
isset($params['default-input-value'])
? $params['default-input-value']
: 'site-default'
);
endif;
$settingDefaulted = (is_null($setting) or ($settingDefault === $setting));
if ( !is_callable($options)) :
$checked = array();
if ($settingDefaulted) :
$checked[$defaultInputValue] = ' checked="checked"';
endif;
foreach ($options as $value => $label) :
if ($setting == $value) :
$checked[$value] = ' checked="checked"';
else :
$checked[$value] = '';
endif;
endforeach;
endif;
$defaulted = array();
if ($defaultInputName != $inputName) :
$defaulted['yes'] = ($settingDefaulted ? ' checked="checked"' : '');
$defaulted['no'] = ($settingDefaulted ? '' : ' checked="checked"');
else :
$defaulted['yes'] = (isset($checked[$defaultInputValue]) ? $checked[$defaultInputValue] : '');
endif;
if (isset($params['defaulted'])) :
$defaulted['yes'] = ($params['defaulted'] ? ' checked="checked"' : '');
$defaulted['no'] = ($params['defaulted'] ? '' : ' checked="checked"');
endif;
if ($offerSiteWide) :
?>