| @@ -1,13 +1,11 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | /** |
| 3 | - * Recommended Widget file | |
| 3 | + * UI: Recommended Widget class | |
| 4 | 4 | * |
| 5 | - * This provides a widget to put on a page, will have parsely recommended articles | |
| 5 | + * Provides a widget with Parse.ly recommended articles. | |
| 6 | 6 | * |
| 7 | - * @category Components | |
| 8 | - * @package WordPress | |
| 9 | - * @subpackage Parse.ly | |
| 7 | + * @package Parsely | |
| 10 | 8 | */ |
| 11 | 9 | |
| 12 | 10 | declare(strict_types=1); |
| 13 | 11 | |
| @@ -12,20 +10,59 @@ | ||
| 12 | 10 | declare(strict_types=1); |
| 13 | 11 | |
| 14 | 12 | namespace Parsely\UI; |
| 15 | 13 | |
| 14 | +use Parsely\Parsely; | |
| 16 | 15 | use WP_Widget; |
| 17 | 16 | |
| 17 | +use function Parsely\Utils\get_asset_info; | |
| 18 | + | |
| 18 | 19 | use const Parsely\PARSELY_FILE; |
| 19 | 20 | |
| 20 | 21 | /** |
| 21 | - * This is the class for the recommended widget. | |
| 22 | + * Provides a widget with Parse.ly recommended articles. | |
| 23 | + * | |
| 24 | + * @phpstan-type Widget_Settings array{ | |
| 25 | + * title: string, | |
| 26 | + * return_limit: int, | |
| 27 | + * display_direction: string, | |
| 28 | + * published_within: int, | |
| 29 | + * sort: string, | |
| 30 | + * personalize_results: bool, | |
| 31 | + * img_src: string, | |
| 32 | + * display_author: bool, | |
| 33 | + * } | |
| 22 | 34 | */ |
| 23 | 35 | final class Recommended_Widget extends WP_Widget { |
| 24 | 36 | /** |
| 25 | - * This is the constructor function. | |
| 37 | + * Instance of Parsely class. | |
| 38 | + * | |
| 39 | + * @var Parsely | |
| 26 | 40 | */ |
| 27 | - public function __construct() { | |
| 41 | + private $parsely; | |
| 42 | + | |
| 43 | + /** | |
| 44 | + * Default values of widget settings | |
| 45 | + * | |
| 46 | + * @var Widget_Settings | |
| 47 | + */ | |
| 48 | + private static $default_widget_settings = array( | |
| 49 | + 'title' => '', | |
| 50 | + 'return_limit' => 5, | |
| 51 | + 'display_direction' => 'vertical', | |
| 52 | + 'published_within' => 0, | |
| 53 | + 'sort' => 'score', | |
| 54 | + 'personalize_results' => false, | |
| 55 | + 'img_src' => 'parsely_thumb', | |
| 56 | + 'display_author' => false, | |
| 57 | + ); | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Constructor. | |
| 61 | + * | |
| 62 | + * @param Parsely $parsely Instance of Parsely class. | |
| 63 | + */ | |
| 64 | + public function __construct( Parsely $parsely ) { | |
| 28 | 65 | parent::__construct( |
| 29 | 66 | 'Parsely_Recommended_Widget', |
| 30 | 67 | __( 'Parse.ly Recommended Widget', 'wp-parsely' ), |
| 31 | 68 | array( |
| @@ -32,43 +69,39 @@ | ||
| 32 | 69 | 'classname' => 'Recommended_Widget parsely-recommended-widget-hidden', |
| 33 | 70 | 'description' => __( 'Display a list of post recommendations, personalized for a visitor or the current post.', 'wp-parsely' ), |
| 34 | 71 | ) |
| 35 | 72 | ); |
| 73 | + | |
| 74 | + $this->parsely = $parsely; | |
| 36 | 75 | } |
| 37 | 76 | |
| 38 | 77 | /** |
| 39 | - * Get the URL for the Recommendations API (GET /related). | |
| 78 | + * Gets the URL for the Recommendations API (GET /related). | |
| 40 | 79 | * |
| 41 | - * @see https://www.parse.ly/help/api/recommendations#get-related | |
| 80 | + * @since 2.5.0 | |
| 42 | 81 | * |
| 82 | + * @see https://docs.parse.ly/content-recommendations/ | |
| 83 | + * | |
| 43 | 84 | * @internal While this is a public method now, this should be moved to a new class. |
| 44 | 85 | * |
| 45 | - * @since 2.5.0 | |
| 46 | - * | |
| 47 | - * @param string $api_key Publisher Site ID (API key). | |
| 48 | - * @param int|null $published_within Publication filter start date; see https://www.parse.ly/help/api/time for | |
| 49 | - * formatting details. No restriction by default. | |
| 50 | - * @param string|null $sort What to sort the results by. There are currently 2 valid options: `score`, which | |
| 51 | - * will sort articles by overall relevance and `pub_date` which will sort results by | |
| 52 | - * their publication date. The default is `score`. | |
| 53 | - * @param string|null $boost Available for sort=score only. Sub-sort value to re-rank relevant posts that | |
| 54 | - * received high e.g. views; default is undefined. | |
| 86 | + * @param string $site_id Publisher Site ID. | |
| 87 | + * @param int|null $published_within Publication filter start date; see https://docs.parse.ly/api-date-time/ for | |
| 88 | + * formatting details. No restriction by default. | |
| 89 | + * @param string|null $sort What to sort the results by. There are currently 2 valid options: `score`, | |
| 90 | + * which will sort articles by overall relevance and `pub_date` which will sort | |
| 91 | + * results by their publication date. The default is `score`. | |
| 55 | 92 | * @param int $return_limit Number of records to retrieve; defaults to "10". |
| 56 | 93 | * @return string API URL. |
| 57 | 94 | */ |
| 58 | - private function get_api_url( string $api_key, ?int $published_within, ?string $sort, ?string $boost, int $return_limit ): string { | |
| 59 | - $related_api_endpoint = 'https://api.parsely.com/v2/related'; | |
| 95 | + private function get_api_url( string $site_id, ?int $published_within, ?string $sort, int $return_limit ): string { | |
| 96 | + $related_api_endpoint = Parsely::PUBLIC_API_BASE_URL . '/related'; | |
| 60 | 97 | |
| 61 | 98 | $query_args = array( |
| 62 | - 'apikey' => $api_key, | |
| 99 | + 'apikey' => $site_id, | |
| 63 | 100 | 'sort' => $sort, |
| 64 | 101 | 'limit' => $return_limit, |
| 65 | 102 | ); |
| 66 | 103 | |
| 67 | - if ( 'score' === $sort && 'no-boost' !== $boost ) { | |
| 68 | - $query_args['boost'] = $boost; | |
| 69 | - } | |
| 70 | - | |
| 71 | 104 | if ( null !== $published_within && 0 !== $published_within ) { |
| 72 | 105 | $query_args['pub_date_start'] = $published_within . 'd'; |
| 73 | 106 | } |
| 74 | 107 | |
| @@ -75,19 +108,19 @@ | ||
| 75 | 108 | return add_query_arg( $query_args, $related_api_endpoint ); |
| 76 | 109 | } |
| 77 | 110 | |
| 78 | 111 | /** |
| 79 | - * This is the widget function | |
| 112 | + * This is the widget function. | |
| 80 | 113 | * |
| 81 | - * @param array $args Widget Arguments. | |
| 82 | - * @param array $instance Values saved to the db. | |
| 83 | - * @return void | |
| 114 | + * @param array<string, string> $args Widget Arguments. | |
| 115 | + * @param array<mixed> $widget_settings Values saved to the db. | |
| 84 | 116 | */ |
| 85 | - public function widget( $args, $instance ): void { | |
| 86 | - if ( ! $this->api_key_and_secret_are_populated() ) { | |
| 117 | + public function widget( $args, $widget_settings ): void /* @phpstan-ignore-line */ { | |
| 118 | + if ( ! $this->site_id_and_secret_are_populated() ) { | |
| 87 | 119 | return; |
| 88 | 120 | } |
| 89 | 121 | |
| 122 | + $instance = $this->get_widget_settings( $widget_settings ); | |
| 90 | 123 | $removed_title_esc = remove_filter( 'widget_title', 'esc_html' ); |
| 91 | 124 | |
| 92 | 125 | /** This filter is documented in wp-includes/widgets/class-wp-widget-pages.php */ |
| 93 | 126 | $title = apply_filters( 'widget_title', $instance['title'] ); |
| @@ -99,33 +132,31 @@ | ||
| 99 | 132 | $title_html = $args['before_widget'] . $args['before_title'] . $title . $args['after_title']; |
| 100 | 133 | echo wp_kses_post( $title_html ); |
| 101 | 134 | |
| 102 | 135 | // Set up the variables. |
| 103 | - $options = get_option( 'parsely' ); | |
| 104 | 136 | $api_url = $this->get_api_url( |
| 105 | - $options['apikey'], | |
| 106 | - $instance['published_within'], | |
| 137 | + $this->parsely->get_site_id(), | |
| 138 | + (int) $instance['published_within'], // @phpstan-ignore-line | |
| 107 | 139 | $instance['sort'], |
| 108 | - $instance['boost'], | |
| 109 | - (int) $instance['return_limit'] | |
| 140 | + (int) $instance['return_limit'] // @phpstan-ignore-line | |
| 110 | 141 | ); |
| 111 | 142 | |
| 112 | - $recommended_widget_script_asset = require plugin_dir_path( PARSELY_FILE ) . 'build/recommended-widget.asset.php'; | |
| 113 | - | |
| 114 | 143 | ?> |
| 115 | 144 | |
| 116 | 145 | <div class="parsely-recommended-widget" |
| 117 | - data-parsely-widget-display-author="<?php echo esc_attr( wp_json_encode( isset( $instance['display_author'] ) && $instance['display_author'] ) ); ?>" | |
| 118 | - data-parsely-widget-display-direction="<?php echo esc_attr( $instance['display_direction'] ?? '' ); ?>" | |
| 146 | + data-parsely-widget-display-author="<?php echo esc_attr( (string) wp_json_encode( $instance['display_author'] ) ); ?>" | |
| 147 | + data-parsely-widget-display-direction="<?php echo esc_attr( $instance['display_direction'] ); ?>" | |
| 119 | 148 | data-parsely-widget-api-url="<?php echo esc_url( $api_url ); ?>" |
| 120 | - data-parsely-widget-img-display="<?php echo esc_attr( $instance['img_src'] ?? '' ); ?>" | |
| 121 | - data-parsely-widget-permalink="<?php echo esc_url( get_permalink() ); ?>" | |
| 122 | - data-parsely-widget-personalized="<?php echo esc_attr( wp_json_encode( isset( $instance['personalize_results'] ) && $instance['personalize_results'] ) ); ?>" | |
| 123 | - data-parsely-widget-id="<?php echo esc_attr( $this->id ); ?>" | |
| 149 | + data-parsely-widget-img-display="<?php echo esc_attr( $instance['img_src'] ); ?>" | |
| 150 | + data-parsely-widget-permalink="<?php echo esc_url( (string) get_permalink() ); ?>" | |
| 151 | + data-parsely-widget-personalized="<?php echo esc_attr( (string) wp_json_encode( $instance['personalize_results'] ) ); ?>" | |
| 152 | + data-parsely-widget-id="<?php echo esc_attr( (string) $this->id ); ?>" | |
| 124 | 153 | ></div> |
| 125 | 154 | |
| 126 | 155 | <?php |
| 127 | 156 | |
| 157 | + $recommended_widget_script_asset = get_asset_info( 'build/recommended-widget.asset.php' ); | |
| 158 | + | |
| 128 | 159 | wp_register_script( |
| 129 | 160 | 'wp-parsely-recommended-widget', |
| 130 | 161 | plugin_dir_url( PARSELY_FILE ) . 'build/recommended-widget.js', |
| 131 | 162 | $recommended_widget_script_asset['dependencies'], |
| @@ -146,14 +177,14 @@ | ||
| 146 | 177 | echo wp_kses_post( $args['after_widget'] ); |
| 147 | 178 | } |
| 148 | 179 | |
| 149 | 180 | /** |
| 150 | - * This is the form function | |
| 181 | + * This is the form function. | |
| 151 | 182 | * |
| 152 | - * @param array $instance Values saved to the db. | |
| 183 | + * @param array<mixed> $current_settings Values saved to the db. | |
| 153 | 184 | */ |
| 154 | - public function form( $instance ): void { | |
| 155 | - if ( ! $this->api_key_and_secret_are_populated() ) { | |
| 185 | + public function form( $current_settings ): string { | |
| 186 | + if ( ! $this->site_id_and_secret_are_populated() ) { | |
| 156 | 187 | $settings_page_url = add_query_arg( 'page', 'parsely', get_admin_url() . 'options-general.php' ); |
| 157 | 188 | |
| 158 | 189 | $message = sprintf( |
| 159 | 190 | /* translators: %s: Plugin settings page URL */ |
| @@ -162,32 +193,31 @@ | ||
| 162 | 193 | ); |
| 163 | 194 | |
| 164 | 195 | echo '<p>', wp_kses_post( $message ), '</p>'; |
| 165 | 196 | |
| 166 | - return; | |
| 197 | + return ''; | |
| 167 | 198 | } |
| 168 | 199 | |
| 200 | + $instance = $this->get_widget_settings( $current_settings ); | |
| 201 | + | |
| 169 | 202 | // editable fields: title. |
| 170 | - $title = ! empty( $instance['title'] ) ? $instance['title'] : ''; | |
| 171 | - $return_limit = ! empty( $instance['return_limit'] ) ? (int) $instance['return_limit'] : 5; | |
| 172 | - $display_direction = ! empty( $instance['display_direction'] ) ? $instance['display_direction'] : 'vertical'; | |
| 173 | - $published_within = ! empty( $instance['published_within'] ) ? $instance['published_within'] : 0; | |
| 174 | - $sort = ! empty( $instance['sort'] ) ? $instance['sort'] : 'score'; | |
| 175 | - $boost = ! empty( $instance['boost'] ) ? $instance['boost'] : 'views'; | |
| 176 | - $personalize_results = ! empty( $instance['personalize_results'] ) ? $instance['personalize_results'] : false; | |
| 177 | - $img_src = ! empty( $instance['img_src'] ) ? $instance['img_src'] : 'parsely_thumb'; | |
| 178 | - $display_author = ! empty( $instance['display_author'] ) ? $instance['display_author'] : false; | |
| 203 | + $title = $instance['title']; | |
| 204 | + $return_limit = $instance['return_limit']; | |
| 205 | + $display_direction = $instance['display_direction']; | |
| 206 | + $published_within = $instance['published_within']; | |
| 207 | + $sort = $instance['sort']; | |
| 208 | + $personalize_results = $instance['personalize_results']; | |
| 209 | + $img_src = $instance['img_src']; | |
| 210 | + $display_author = $instance['display_author']; | |
| 179 | 211 | |
| 180 | 212 | $instance['return_limit'] = $return_limit; |
| 181 | 213 | $instance['display_direction'] = $display_direction; |
| 182 | 214 | $instance['published_within'] = $published_within; |
| 183 | 215 | $instance['sort'] = $sort; |
| 184 | - $instance['boost'] = $boost; | |
| 185 | 216 | $instance['personalize_results'] = $personalize_results; |
| 186 | 217 | $instance['img_src'] = $img_src; |
| 187 | 218 | $instance['display_author'] = $display_author; |
| 188 | 219 | |
| 189 | - $boost_params = $this->get_boost_params(); | |
| 190 | 220 | ?> |
| 191 | 221 | <p> |
| 192 | 222 | <label for="<?php echo esc_attr( $this->get_field_id( 'title' ) ); ?>"><?php esc_html_e( 'Title:', 'wp-parsely' ); ?></label> |
| 193 | 223 | <br> |
| @@ -200,9 +230,9 @@ | ||
| 200 | 230 | <span id="<?php echo esc_attr( $this->get_field_id( 'published_within_unit' ) ); ?>"> <?php esc_html_e( 'days (0 for no limit).', 'wp-parsely' ); ?></span> |
| 201 | 231 | </p> |
| 202 | 232 | <p> |
| 203 | 233 | <label for="<?php echo esc_attr( $this->get_field_id( 'return_limit' ) ); ?>"><?php esc_html_e( 'Number of posts to show (max 20):', 'wp-parsely' ); ?></label> |
| 204 | - <input type="number" id="<?php echo esc_attr( $this->get_field_id( 'return_limit' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'return_limit' ) ); ?>" value="<?php echo esc_attr( $instance['return_limit'] ); ?>" min="1" max="20" class="tiny-text" /> | |
| 234 | + <input type="number" id="<?php echo esc_attr( $this->get_field_id( 'return_limit' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'return_limit' ) ); ?>" value="<?php echo esc_attr( (string) $instance['return_limit'] ); ?>" min="1" max="20" class="tiny-text" /> | |
| 205 | 235 | </p> |
| 206 | 236 | <p> |
| 207 | 237 | <fieldset> |
| 208 | 238 | <legend><?php esc_html_e( 'Display entries:', 'wp-parsely' ); ?></legend> |
| @@ -218,23 +248,13 @@ | ||
| 218 | 248 | <p> |
| 219 | 249 | <label for="<?php echo esc_attr( $this->get_field_id( 'sort' ) ); ?>"><?php esc_html_e( 'Sort by:', 'wp-parsely' ); ?></label> |
| 220 | 250 | <br> |
| 221 | 251 | <select id="<?php echo esc_attr( $this->get_field_id( 'sort' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'sort' ) ); ?>" class="widefat"> |
| 222 | - <option<?php selected( $instance['sort'], 'score' ); ?> value="score"><?php esc_html_e( 'Score (relevancy, boostable)', 'wp-parsely' ); ?></option> | |
| 223 | - <option<?php selected( $instance['sort'], 'pub_date' ); ?> value="pub_date"><?php esc_html_e( 'Publish date (not boostable)', 'wp-parsely' ); ?></option> | |
| 252 | + <option<?php selected( $instance['sort'], 'score' ); ?> value="score"><?php esc_html_e( 'Score', 'wp-parsely' ); ?></option> | |
| 253 | + <option<?php selected( $instance['sort'], 'pub_date' ); ?> value="pub_date"><?php esc_html_e( 'Publish date', 'wp-parsely' ); ?></option> | |
| 224 | 254 | </select> |
| 225 | 255 | </p> |
| 226 | 256 | <p> |
| 227 | - <label for="<?php echo esc_attr( $this->get_field_id( 'boost' ) ); ?>"><?php esc_html_e( 'Boost by:', 'wp-parsely' ); ?></label> | |
| 228 | - <br> | |
| 229 | - <select id="<?php echo esc_attr( $this->get_field_id( 'boost' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'boost' ) ); ?>" class="widefat"> | |
| 230 | - <?php foreach ( $boost_params as $boost_param => $description ) { ?> | |
| 231 | - <option<?php selected( $instance['boost'], $boost_param ); ?> value="<?php echo esc_attr( $boost_param ); ?>"><?php echo esc_html( $description ); ?></option> | |
| 232 | - <?php } ?> | |
| 233 | - </select> | |
| 234 | - | |
| 235 | - </p> | |
| 236 | - <p> | |
| 237 | 257 | <label for="<?php echo esc_attr( $this->get_field_id( 'img_src' ) ); ?>"><?php esc_html_e( 'Image source:', 'wp-parsely' ); ?></label> |
| 238 | 258 | <br> |
| 239 | 259 | <select id="<?php echo esc_attr( $this->get_field_id( 'img_src' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'img_src' ) ); ?>" class="widefat"> |
| 240 | 260 | <option<?php selected( $instance['img_src'], 'parsely_thumb' ); ?> value="parsely_thumb"><?php esc_html_e( 'Parse.ly generated thumbnail (85x85px)', 'wp-parsely' ); ?></option> |
| @@ -249,87 +269,61 @@ | ||
| 249 | 269 | <input type="checkbox" id="<?php echo esc_attr( $this->get_field_id( 'personalize_results' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'personalize_results' ) ); ?>" value="personalize_results"<?php checked( $instance['personalize_results'], 'personalize_results' ); ?> /> |
| 250 | 270 | <label for="<?php echo esc_attr( $this->get_field_id( 'personalize_results' ) ); ?>"><?php esc_html_e( 'Personalize recommended results', 'wp-parsely' ); ?></label> |
| 251 | 271 | </p> |
| 252 | 272 | <?php |
| 273 | + | |
| 274 | + return ''; | |
| 253 | 275 | } |
| 254 | 276 | |
| 255 | 277 | /** |
| 256 | - * This is the update function | |
| 278 | + * This is the update function. | |
| 257 | 279 | * |
| 258 | - * @param array $new_instance The new values for the db. | |
| 259 | - * @param array $old_instance Values saved to the db. | |
| 260 | - * @return array | |
| 280 | + * @param Widget_Settings $new_instance The new values for the db. | |
| 281 | + * @param Widget_Settings $old_instance Values saved to the db. | |
| 282 | + * @return Widget_Settings | |
| 261 | 283 | */ |
| 262 | - public function update( $new_instance, $old_instance ): array { | |
| 284 | + public function update( $new_instance, $old_instance ) /* @phpstan-ignore-line */ { | |
| 263 | 285 | $instance = $old_instance; |
| 264 | 286 | $instance['title'] = trim( wp_kses_post( $new_instance['title'] ) ); |
| 265 | - $instance['published_within'] = is_int( $new_instance['published_within'] ) ? $new_instance['published_within'] : (int) trim( $new_instance['published_within'] ); | |
| 266 | - $instance['return_limit'] = (int) $new_instance['return_limit'] <= 20 ? (int) $new_instance['return_limit'] : 20; | |
| 287 | + $instance['published_within'] = $new_instance['published_within']; | |
| 288 | + $instance['return_limit'] = $new_instance['return_limit'] <= 20 ? $new_instance['return_limit'] : 20; | |
| 267 | 289 | $instance['display_direction'] = trim( $new_instance['display_direction'] ); |
| 268 | 290 | $instance['sort'] = trim( $new_instance['sort'] ); |
| 269 | - $instance['boost'] = trim( $new_instance['boost'] ); | |
| 270 | 291 | $instance['display_author'] = $new_instance['display_author']; |
| 271 | 292 | $instance['personalize_results'] = $new_instance['personalize_results']; |
| 272 | 293 | $instance['img_src'] = trim( $new_instance['img_src'] ); |
| 294 | + | |
| 273 | 295 | return $instance; |
| 274 | 296 | } |
| 275 | 297 | |
| 276 | 298 | /** |
| 277 | - * Return the list of boost parameters, values and labels. | |
| 299 | + * Checks if both the Site ID and API secret settings are populated with | |
| 300 | + * non-empty values. | |
| 278 | 301 | * |
| 279 | 302 | * @since 2.5.0 |
| 280 | 303 | * |
| 281 | - * @return array<string, string> Boost parameters values and labels. | |
| 304 | + * @return bool True if Site ID and API Secret settings are set. | |
| 305 | + * False otherwise. | |
| 282 | 306 | */ |
| 283 | - private function get_boost_params(): array { | |
| 284 | - return array( | |
| 285 | - 'no-boost' => __( 'No boost', 'wp-parsely' ), | |
| 286 | - 'views' => __( 'Page views', 'wp-parsely' ), | |
| 287 | - 'mobile_views' => __( 'Page views on mobile devices', 'wp-parsely' ), | |
| 288 | - 'tablet_views' => __( 'Page views on tablet devices', 'wp-parsely' ), | |
| 289 | - 'desktop_views' => __( 'Page views on desktop devices', 'wp-parsely' ), | |
| 290 | - 'visitors' => __( 'Unique page visitors, total', 'wp-parsely' ), | |
| 291 | - 'visitors_new' => __( 'New visitors', 'wp-parsely' ), | |
| 292 | - 'visitors_returning' => __( 'Returning visitors', 'wp-parsely' ), | |
| 293 | - 'engaged_minutes' => __( 'Total engagement time in minutes', 'wp-parsely' ), | |
| 294 | - 'avg_engaged' => __( 'Engaged minutes spent by total visitors', 'wp-parsely' ), | |
| 295 | - 'avg_engaged_new' => __( 'Average engaged minutes spent by new visitors', 'wp-parsely' ), | |
| 296 | - 'avg_engaged_returning' => __( 'Average engaged minutes spent by returning visitors', 'wp-parsely' ), | |
| 297 | - 'social_interactions' => __( 'Total for Facebook, Twitter, LinkedIn, and Pinterest', 'wp-parsely' ), | |
| 298 | - 'fb_interactions' => __( 'Count of Facebook shares, likes, and comments', 'wp-parsely' ), | |
| 299 | - 'tw_interactions' => __( 'Count of Twitter tweets and retweets', 'wp-parsely' ), | |
| 300 | - 'pi_interactions' => __( 'Count of Pinterest pins', 'wp-parsely' ), | |
| 301 | - 'social_referrals' => __( 'Page views where the referrer was any social network', 'wp-parsely' ), | |
| 302 | - 'fb_referrals' => __( 'Page views where the referrer was facebook.com', 'wp-parsely' ), | |
| 303 | - 'tw_referrals' => __( 'Page views where the referrer was twitter.com', 'wp-parsely' ), | |
| 304 | - 'pi_referrals' => __( 'Page views where the referrer was pinterest.com', 'wp-parsely' ), | |
| 305 | - ); | |
| 307 | + private function site_id_and_secret_are_populated(): bool { | |
| 308 | + return $this->parsely->site_id_is_set() && $this->parsely->api_secret_is_set(); | |
| 306 | 309 | } |
| 307 | 310 | |
| 308 | 311 | /** |
| 309 | - * Check if both the API key and API secret settings are populated with non-empty values. | |
| 312 | + * Returns all widget settings by assigning defaults if a setting isn't present | |
| 310 | 313 | * |
| 311 | - * @since 2.5.0 | |
| 314 | + * @since 3.7.0 | |
| 312 | 315 | * |
| 313 | - * @return bool True if apikey and api_secret settings are not empty strings. False otherwise. | |
| 316 | + * @param array<string, mixed> $settings Widget Options. | |
| 317 | + * @return Widget_Settings | |
| 314 | 318 | */ |
| 315 | - private function api_key_and_secret_are_populated(): bool { | |
| 316 | - $options = get_option( 'parsely' ); | |
| 319 | + public function get_widget_settings( array $settings ) { | |
| 320 | + /** | |
| 321 | + * Variable. | |
| 322 | + * | |
| 323 | + * @var Widget_Settings | |
| 324 | + */ | |
| 325 | + $widget_settings = $settings; | |
| 317 | 326 | |
| 318 | - // No options are saved, so API key is not available. | |
| 319 | - if ( ! is_array( $options ) ) { | |
| 320 | - return false; | |
| 321 | - } | |
| 322 | - | |
| 323 | - // Parse.ly Site ID settings field is not populated. | |
| 324 | - if ( ! array_key_exists( 'apikey', $options ) || '' === $options['apikey'] ) { | |
| 325 | - return false; | |
| 326 | - } | |
| 327 | - | |
| 328 | - // Parse.ly API Secret settings field is not populated. | |
| 329 | - if ( ! array_key_exists( 'api_secret', $options ) || '' === $options['api_secret'] ) { | |
| 330 | - return false; | |
| 331 | - } | |
| 332 | - | |
| 333 | - return true; | |
| 327 | + return array_merge( self::$default_widget_settings, $widget_settings ); | |
| 334 | 328 | } |
| 335 | 329 | } |