Completed
Push — feature/videopress-uploader ( 58b703...e9e1f9 )
by
unknown
104:20 queued 95:05
created

modules/publicize/publicize-jetpack.php (1 issue)

Severity

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
3
class Publicize extends Publicize_Base {
4
5
	function __construct() {
6
		parent::__construct();
7
8
		add_filter( 'jetpack_xmlrpc_methods', array( $this, 'register_update_publicize_connections_xmlrpc_method' ) );
9
10
		add_action( 'load-settings_page_sharing', array( $this, 'admin_page_load' ), 9 );
11
12
		add_action( 'wp_ajax_publicize_tumblr_options_page', array( $this, 'options_page_tumblr' ) );
13
		add_action( 'wp_ajax_publicize_facebook_options_page', array( $this, 'options_page_facebook' ) );
14
		add_action( 'wp_ajax_publicize_twitter_options_page', array( $this, 'options_page_twitter' ) );
15
		add_action( 'wp_ajax_publicize_linkedin_options_page', array( $this, 'options_page_linkedin' ) );
16
		add_action( 'wp_ajax_publicize_path_options_page', array( $this, 'options_page_path' ) );
17
		add_action( 'wp_ajax_publicize_google_plus_options_page', array( $this, 'options_page_google_plus' ) );
18
19
		add_action( 'wp_ajax_publicize_tumblr_options_save', array( $this, 'options_save_tumblr' ) );
20
		add_action( 'wp_ajax_publicize_facebook_options_save', array( $this, 'options_save_facebook' ) );
21
		add_action( 'wp_ajax_publicize_twitter_options_save', array( $this, 'options_save_twitter' ) );
22
		add_action( 'wp_ajax_publicize_linkedin_options_save', array( $this, 'options_save_linkedin' ) );
23
		add_action( 'wp_ajax_publicize_path_options_save', array( $this, 'options_save_path' ) );
24
		add_action( 'wp_ajax_publicize_google_plus_options_save', array( $this, 'options_save_google_plus' ) );
25
26
		add_action( 'load-settings_page_sharing', array( $this, 'force_user_connection' ) );
27
28
		add_filter( 'publicize_checkbox_default', array( $this, 'publicize_checkbox_default' ), 10, 4 );
29
30
		add_action( 'wp_insert_post', array( $this, 'save_publicized' ), 11, 3 );
31
32
		add_filter( 'jetpack_twitter_cards_site_tag', array( $this, 'enhaced_twitter_cards_site_tag' ) );
33
34
		add_action( 'publicize_save_meta', array( $this, 'save_publicized_twitter_account' ), 10, 4 );
35
		add_action( 'publicize_save_meta', array( $this, 'save_publicized_facebook_account' ), 10, 4 );
36
37
		add_filter( 'jetpack_sharing_twitter_via', array( $this, 'get_publicized_twitter_account' ), 10, 2 );
38
39
		include_once ( JETPACK__PLUGIN_DIR . 'modules/publicize/enhanced-open-graph.php' );
40
	}
41
42
	function force_user_connection() {
43
		global $current_user;
44
		$user_token = Jetpack_Data::get_access_token( $current_user->ID );
45
		$is_user_connected = $user_token && !is_wp_error( $user_token );
46
47
		// If the user is already connected via Jetpack, then we're good
48
		if ( $is_user_connected )
49
			return;
50
51
		// If they're not connected, then remove the Publicize UI and tell them they need to connect first
52
		global $publicize_ui;
53
		remove_action( 'pre_admin_screen_sharing', array( $publicize_ui, 'admin_page' ) );
54
55
		// Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
56
		// Jetpack::init()->admin_styles();
57
		add_action( 'pre_admin_screen_sharing', array( $this, 'admin_page_warning' ), 1 );
58
	}
59
60
	function admin_page_warning() {
61
		$jetpack = Jetpack::init();
62
		$blog_name = get_bloginfo( 'blogname' );
63
		if ( empty( $blog_name ) ) {
64
			$blog_name = home_url( '/' );
65
		}
66
67
		?>
68
		<div id="message" class="updated jetpack-message jp-connect">
69
			<div class="jetpack-wrap-container">
70
				<div class="jetpack-text-container">
71
					<p><?php printf(
72
						esc_html( wptexturize( __( "To use Publicize, you'll need to link your %s account to your WordPress.com account using the link below.", 'jetpack' ) ) ),
73
						'<strong>' . esc_html( $blog_name ) . '</strong>'
74
					); ?></p>
75
					<p><?php echo esc_html( wptexturize( __( "If you don't have a WordPress.com account yet, you can sign up for free in just a few seconds.", 'jetpack' ) ) ); ?></p>
76
				</div>
77
				<div class="jetpack-install-container">
78
					<p class="submit"><a href="<?php echo $jetpack->build_connect_url( false, menu_page_url( 'sharing', false ) ); ?>" class="button-connector" id="wpcom-connect"><?php esc_html_e( 'Link account with WordPress.com', 'jetpack' ); ?></a></p>
79
				</div>
80
			</div>
81
		</div>
82
		<?php
83
	}
84
85
	/**
86
	 * Remove a Publicize connection
87
	 */
88
	function disconnect( $service_name, $connection_id, $_blog_id = false, $_user_id = false, $force_delete = false ) {
89
		Jetpack::load_xml_rpc_client();
90
		$xml = new Jetpack_IXR_Client();
91
		$xml->query( 'jetpack.deletePublicizeConnection', $connection_id );
92
93
		if ( ! $xml->isError() ) {
94
			Jetpack_Options::update_option( 'publicize_connections', $xml->getResponse() );
95
		} else {
96
			return false;
97
		}
98
	}
99
100
	function receive_updated_publicize_connections( $publicize_connections ) {
101
		Jetpack_Options::update_option( 'publicize_connections', $publicize_connections );
102
		return true;
103
	}
104
105
	function register_update_publicize_connections_xmlrpc_method( $methods ) {
106
		return array_merge( $methods, array(
107
			'jetpack.updatePublicizeConnections' => array( $this, 'receive_updated_publicize_connections' ),
108
		) );
109
	}
110
111
	function get_connections( $service_name, $_blog_id = false, $_user_id = false ) {
112
		$connections = Jetpack_Options::get_option( 'publicize_connections' );
113
		$connections_to_return = array();
114
		if ( !empty( $connections ) && is_array( $connections ) ) {
115
			if ( !empty( $connections[$service_name] ) ) {
116
				foreach( $connections[$service_name] as $id => $connection ) {
117
					if ( 0 == $connection['connection_data']['user_id'] || $this->user_id() == $connection['connection_data']['user_id'] ) {
118
						$connections_to_return[$id] = $connection;
119
					}
120
				}
121
			}
122
			return $connections_to_return;
123
		}
124
		return false;
125
	}
126
127
	function get_connection_id( $connection ) {
128
		return $connection['connection_data']['id'];
129
	}
130
131
	function get_connection_meta( $connection ) {
132
		$connection['user_id'] = $connection['connection_data']['user_id']; // Allows for shared connections
133
		return $connection;
134
	}
135
136
	function admin_page_load() {
137
		if ( isset( $_GET['action'] ) ) {
138
			if ( isset( $_GET['service'] ) )
139
				$service_name = $_GET['service'];
140
141
			switch ( $_GET['action'] ) {
142
			case 'error':
143
				add_action( 'pre_admin_screen_sharing', array( $this, 'display_connection_error' ), 9 );
144
				break;
145
146
			case 'request':
147
				check_admin_referer( 'keyring-request', 'kr_nonce' );
148
				check_admin_referer( "keyring-request-$service_name", 'nonce' );
149
150
				$verification = Jetpack::create_nonce( 'publicize' );
151
152
				$stats_options = get_option( 'stats_options' );
153
				$wpcom_blog_id = Jetpack_Options::get_option('id');
154
				$wpcom_blog_id = !empty( $wpcom_blog_id ) ? $wpcom_blog_id : $stats_options['blog_id'];
155
156
				$user = wp_get_current_user();
157
				$redirect = $this->api_url( $service_name, urlencode_deep( array(
158
					'action'       => 'request',
159
					'redirect_uri' => add_query_arg( array( 'action' => 'done' ), menu_page_url( 'sharing', false ) ),
160
					'for'          => 'publicize', // required flag that says this connection is intended for publicize
161
					'siteurl'      => site_url(),
162
					'state'        => $user->ID,
163
					'blog_id'      => $wpcom_blog_id,
164
					'secret_1'	   => $verification['secret_1'],
165
					'secret_2'     => $verification['secret_2'],
166
					'eol'		   => $verification['eol'],
167
				) ) );
168
				wp_redirect( $redirect );
169
				exit;
170
				break;
171
172
			case 'completed':
173
				Jetpack::load_xml_rpc_client();
174
				$xml = new Jetpack_IXR_Client();
175
				$xml->query( 'jetpack.fetchPublicizeConnections' );
176
177
				if ( ! $xml->isError() ) {
178
					$response = $xml->getResponse();
179
					Jetpack_Options::update_option( 'publicize_connections', $response );
180
				}
181
182
				break;
183
184
			case 'delete':
185
				$id = $_GET['id'];
186
187
				check_admin_referer( 'keyring-request', 'kr_nonce' );
188
				check_admin_referer( "keyring-request-$service_name", 'nonce' );
189
190
				$this->disconnect( $service_name, $id );
191
192
				add_action( 'admin_notices', array( $this, 'display_disconnected' ) );
193
				break;
194
			}
195
		}
196
197
		// Do we really need `admin_styles`? With the new admin UI, it's breaking some bits.
198
		// Errors encountered on WordPress.com's end are passed back as a code
199
		/*
200
		if ( isset( $_GET['action'] ) && 'error' == $_GET['action'] ) {
201
			// Load Jetpack's styles to handle the box
202
			Jetpack::init()->admin_styles();
203
		}
204
		*/
205
	}
206
207
	function display_connection_error() {
208
		$code = false;
209
		if ( isset( $_GET['service'] ) ) {
210
			$service_name = $_GET['service'];
211
			$error = sprintf( __( 'There was a problem connecting to %s to create an authorized connection. Please try again in a moment.', 'jetpack' ), Publicize::get_service_label( $service_name ) );
212
		} else {
213
			if ( isset( $_GET['publicize_error'] ) ) {
214
				$code = strtolower( $_GET['publicize_error'] );
215
				switch ( $code ) {
216
				case '400':
217
					$error = __( 'An invalid request was made. This normally means that something intercepted or corrupted the request from your server to the Jetpack Server. Try again and see if it works this time.', 'jetpack' );
218
					break;
219
				case 'secret_mismatch':
220
					$error = __( 'We could not verify that your server is making an authorized request. Please try again, and make sure there is nothing interfering with requests from your server to the Jetpack Server.', 'jetpack' );
221
					break;
222
				case 'empty_blog_id':
223
					$error = __( 'No blog_id was included in your request. Please try disconnecting Jetpack from WordPress.com and then reconnecting it. Once you have done that, try connecting Publicize again.', 'jetpack' );
224
					break;
225
				case 'empty_state':
226
					$error = sprintf( __( 'No user information was included in your request. Please make sure that your user account has connected to Jetpack. Connect your user account by going to the <a href="%s">Jetpack page</a> within wp-admin.', 'jetpack' ), Jetpack::admin_url() );
227
					break;
228
				default:
229
					$error = __( 'Something which should never happen, happened. Sorry about that. If you try again, maybe it will work.', 'jetpack' );
230
					break;
231
				}
232
			} else {
233
				$error = __( 'There was a problem connecting with Publicize. Please try again in a moment.', 'jetpack' );
234
			}
235
		}
236
		// Using the same formatting/style as Jetpack::admin_notices() error
237
		?>
238
		<div id="message" class="jetpack-message jetpack-err">
239
			<div class="squeezer">
240
				<h2><?php echo wp_kses( $error, array( 'a' => array( 'href' => true ), 'code' => true, 'strong' => true, 'br' => true, 'b' => true ) ); ?></h2>
241
				<?php if ( $code ) : ?>
242
				<p><?php printf( __( 'Error code: %s', 'jetpack' ), esc_html( stripslashes( $code ) ) ); ?></p>
243
				<?php endif; ?>
244
			</div>
245
		</div>
246
		<?php
247
	}
248
249
	function display_disconnected() {
250
		echo "<div class='updated'>\n";
251
		echo '<p>' . esc_html( __( 'That connection has been removed.', 'jetpack' ) ) . "</p>\n";
252
		echo "</div>\n\n";
253
	}
254
255
	function globalization() {
256
		if ( 'on' == $_REQUEST['global'] ) {
257
			$id = $_REQUEST['connection'];
258
259
			if ( !current_user_can( $this->GLOBAL_CAP ) )
260
				return;
261
262
			Jetpack::load_xml_rpc_client();
263
			$xml = new Jetpack_IXR_Client();
264
			$xml->query( 'jetpack.globalizePublicizeConnection', $id, 'globalize' );
265
266
			if ( !$xml->isError() ) {
267
				$response = $xml->getResponse();
268
				Jetpack_Options::update_option( 'publicize_connections', $response );
269
			}
270
		}
271
	}
272
273
	/**
274
	* Gets a URL to the public-api actions. Works like WP's admin_url
275
	*
276
	* @param string $service Shortname of a specific service.
277
	* @return URL to specific public-api process
278
	*/
279
	// on WordPress.com this is/calls Keyring::admin_url
280
	function api_url( $service = false, $params = array() ) {
281
		/**
282
		 * Filters the API URL used to interact with WordPress.com.
283
		 *
284
		 * @module publicize
285
		 *
286
		 * @since 2.0.0
287
		 *
288
		 * @param string https://public-api.wordpress.com/connect/?jetpack=publicize Default Publicize API URL.
289
		 */
290
		$url = apply_filters( 'publicize_api_url', 'https://public-api.wordpress.com/connect/?jetpack=publicize' );
291
292
		if ( $service )
293
			$url = add_query_arg( array( 'service' => $service ), $url );
294
295
		if ( count ( $params ) )
296
			$url = add_query_arg( $params, $url );
297
298
		return $url;
299
	}
300
301 View Code Duplication
	function connect_url( $service_name ) {
302
		return add_query_arg( array(
303
			'action'   => 'request',
304
			'service'  =>  $service_name,
305
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
306
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
307
		), menu_page_url( 'sharing', false ) );
308
	}
309
310
	function refresh_url( $service_name ) {
311
		return add_query_arg( array(
312
			'action'   => 'request',
313
			'service'  => $service_name,
314
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
315
			'refresh'  => 1,
316
			'for'      => 'publicize',
317
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
318
		), admin_url( 'options-general.php?page=sharing' ) );
319
	}
320
321 View Code Duplication
	function disconnect_url( $service_name, $id ) {
322
		return add_query_arg( array (
323
			'action'   => 'delete',
324
			'service'  => $service_name,
325
			'id'       => $id,
326
			'kr_nonce' => wp_create_nonce( 'keyring-request' ),
327
			'nonce'    => wp_create_nonce( "keyring-request-$service_name" ),
328
		), menu_page_url( 'sharing', false ) );
329
	}
330
331
	function get_services( $filter ) {
332
		if ( !in_array( $filter, array( 'all', 'connected' ) ) )
333
			$filter = 'all';
334
335
		$services = array(
336
				'facebook'        => array(),
337
				'twitter'         => array(),
338
				'linkedin'        => array(),
339
				'tumblr'          => array(),
340
				'path'            => array(),
341
				'google_plus'     => array(),
342
		);
343
344
		if ( 'all' == $filter ) {
345
			return $services;
346
		} else {
347
			$connected_services = array();
348
			foreach ( $services as $service => $empty ) {
349
				$connections = $this->get_connections( $service );
350
				if ( $connections )
351
					$connected_services[$service] = $connections;
352
			}
353
			return $connected_services;
354
		}
355
	}
356
357
	function get_connection( $service, $id, $_blog_id = false, $_user_id = false ) {
358
		// Stub
359
	}
360
361
	function flag_post_for_publicize( $new_status, $old_status, $post ) {
362
		if ( 'publish' == $new_status && 'publish' != $old_status ) {
363
			/**
364
			 * Determines whether a post being published gets publicized.
365
			 * Side-note: Possibly our most alliterative filter name.
366
			 *
367
			 * @module publicize
368
			 *
369
			 * @since 4.1.0
370
			 *
371
			 * @param bool should_publicize
372
			 */
373
			$should_publicize = apply_filters( 'publicize_should_publicize_published_post', true, $post );
374
375
			if ( $should_publicize ) {
376
				update_post_meta( $post->ID, $this->PENDING, true );	
377
			}
378
		}
379
	}
380
381
	function test_connection( $service_name, $connection ) {
382
		$connection_test_passed = true;
383
		$connection_test_message = '';
384
		$user_can_refresh = false;
385
386
		$id = $this->get_connection_id( $connection );
387
388
		Jetpack::load_xml_rpc_client();
389
		$xml = new Jetpack_IXR_Client();
390
		$xml->query( 'jetpack.testPublicizeConnection', $id );
391
392
		if ( $xml->isError() ) {
393
			$xml_response = $xml->getResponse();
394
			$connection_test_message = $xml_response['faultString'];
395
			$connection_test_passed = false;
396
		}
397
398
		// Bail if all is well
399
		if ( $connection_test_passed ) {
400
			return true;
401
		}
402
403
		// Set up refresh if the user can
404
		$user_can_refresh = current_user_can( $this->GLOBAL_CAP );
405
		if ( $user_can_refresh ) {
406
			$nonce = wp_create_nonce( "keyring-request-" . $service_name );
407
			$refresh_text = sprintf( _x( 'Refresh connection with %s', 'Refresh connection with {social media service}', 'jetpack' ), $this->get_service_label( $service_name ) );
408
			$refresh_url = $this->refresh_url( $service_name );
409
		}
410
411
		$error_data = array(
412
			'user_can_refresh' => $user_can_refresh,
413
			'refresh_text' => $refresh_text,
414
			'refresh_url' => $refresh_url
415
		);
416
417
		return new WP_Error( 'pub_conn_test_failed', $connection_test_message, $error_data );
418
	}
419
420
	/**
421
	 * Save a flag locally to indicate that this post has already been Publicized via the selected
422
	 * connections.
423
	 */
424
	function save_publicized( $post_ID, $post, $update ) {
0 ignored issues
show
The parameter $update is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
425
		// Only do this when a post transitions to being published
426
		if ( get_post_meta( $post->ID, $this->PENDING ) ) {
427
428
			/**
429
			 * Fires when a post is saved that has is marked as pending publicizing
430
			 *
431
			 * @since 4.1.0
432
			 *
433
			 * @param int The post ID
434
			 */
435
			do_action( 'jetpack_publicize_post', $post->ID );
436
			delete_post_meta( $post->ID, $this->PENDING );
437
			update_post_meta( $post->ID, $this->POST_DONE . 'all', true );
438
		}
439
	}
440
441
	/**
442
	* Options Code
443
	*/
444
445
	function options_page_facebook() {
446
		$connected_services = Jetpack_Options::get_option( 'publicize_connections' );
447
		$connection = $connected_services['facebook'][$_REQUEST['connection']];
448
		$options_to_show = ( ! empty( $connection['connection_data']['meta']['options_responses'] ) ? $connection['connection_data']['meta']['options_responses'] : false );
449
450
		// Nonce check
451
		check_admin_referer( 'options_page_facebook_' . $_REQUEST['connection'] );
452
453
		$me    = ( ! empty( $options_to_show[0] )         ? $options_to_show[0]         : false );
454
		$pages = ( ! empty( $options_to_show[1]['data'] ) ? $options_to_show[1]['data'] : false );
455
456
		$profile_checked = true;
457
		$page_selected = false;
458
459
		if ( !empty( $connection['connection_data']['meta']['facebook_page'] ) ) {
460
			$found = false;
461
			if ( is_array( $pages->data ) ) {
462
				foreach ( $pages->data as $page ) {
463
					if ( $page->id == $connection['connection_data']['meta']['facebook_page'] ) {
464
						$found = true;
465
						break;
466
					}
467
				}
468
			}
469
470
			if ( $found ) {
471
				$profile_checked = false;
472
				$page_selected = $connection['connection_data']['meta']['facebook_page'];
473
			}
474
		}
475
476
		?>
477
478
		<div id="thickbox-content">
479
480
			<?php
481
			ob_start();
482
			Publicize_UI::connected_notice( 'Facebook' );
483
			$update_notice = ob_get_clean();
484
485
			if ( ! empty( $update_notice ) )
486
				echo $update_notice;
487
			?>
488
489
			<?php if ( !empty( $me['name'] ) ) : ?>
490
			<p><?php printf(
491
				esc_html__( 'Publicize to my %s:', 'jetpack' ),
492
				'<strong>' . esc_html__( 'Facebook Wall', 'jetpack' ) . '</strong>'
493
			); ?></p>
494
			<table id="option-profile">
495
				<tbody>
496
					<tr>
497
						<td class="radio"><input type="radio" name="option" data-type="profile" id="<?php echo esc_attr( $me['id'] ) ?>" value="" <?php checked( $profile_checked, true ); ?> /></td>
498
						<td class="thumbnail"><label for="<?php echo esc_attr( $me['id'] ) ?>"><img src="<?php echo esc_url( $me['picture']['data']['url'] ) ?>" width="50" height="50" /></label></td>
499
						<td class="details"><label for="<?php echo esc_attr( $me['id'] ) ?>"><?php echo esc_html( $me['name'] ) ?></label></td>
500
					</tr>
501
				</tbody>
502
			</table>
503
			<?php endif; ?>
504
505
			<?php if ( $pages ) : ?>
506
507
				<p><?php printf(
508
					esc_html__( 'Publicize to my %s:', 'jetpack' ),
509
					'<strong>' . esc_html__( 'Facebook Page', 'jetpack' ) . '</strong>'
510
				); ?></p>
511
				<table id="option-fb-fanpage">
512
					<tbody>
513
514
						<?php foreach ( $pages as $i => $page ) : ?>
515
							<?php if ( ! ( $i % 2 ) ) : ?>
516
								<tr>
517
							<?php endif; ?>
518
									<td class="radio"><input type="radio" name="option" data-type="page" id="<?php echo esc_attr( $page['id'] ) ?>" value="<?php echo esc_attr( $page['id'] ) ?>" <?php checked( $page_selected && $page_selected == $page['id'], true ); ?> /></td>
519
									<td class="thumbnail"><label for="<?php echo esc_attr( $page['id'] ) ?>"><img src="<?php echo esc_url( str_replace( '_s', '_q', $page['picture']['data']['url'] ) ) ?>" width="50" height="50" /></label></td>
520
									<td class="details">
521
										<label for="<?php echo esc_attr( $page['id'] ) ?>">
522
											<span class="name"><?php echo esc_html( $page['name'] ) ?></span><br/>
523
											<span class="category"><?php echo esc_html( $page['category'] ) ?></span>
524
										</label>
525
									</td>
526
							<?php if ( ( $i % 2 ) || ( $i == count( $pages ) - 1 ) ): ?>
527
								</tr>
528
							<?php endif; ?>
529
						<?php endforeach; ?>
530
531
					</tbody>
532
				</table>
533
534
			<?php endif; ?>
535
536
			<?php Publicize_UI::global_checkbox( 'facebook', $_REQUEST['connection'] ); ?>
537
538
			<p style="text-align: center;">
539
				<input type="submit" value="<?php esc_attr_e( 'OK', 'jetpack' ) ?>" class="button fb-options save-options" name="save" data-connection="<?php echo esc_attr( $_REQUEST['connection'] ); ?>" rel="<?php echo wp_create_nonce('save_fb_token_' . $_REQUEST['connection'] ) ?>" />
540
			</p><br/>
541
		</div>
542
543
		<?php
544
	}
545
546
	function options_save_facebook() {
547
		// Nonce check
548
		check_admin_referer( 'save_fb_token_' . $_REQUEST['connection'] );
549
550
		$id = $_POST['connection'];
551
552
		// Check for a numeric page ID
553
		$page_id = $_POST['selected_id'];
554
		if ( !ctype_digit( $page_id ) )
555
			die( 'Security check' );
556
557
		if ( isset( $_POST['selected_id'] ) && 'profile' == $_POST['type'] ) {
558
			// Publish to User Wall/Profile
559
			$options = array(
560
				'facebook_page'       => null,
561
				'facebook_profile'    => true
562
			);
563
564
		} else {
565
			if ( 'page' != $_POST['type'] || !isset( $_POST['selected_id'] ) ) {
566
				return;
567
			}
568
569
			// Publish to Page
570
			$options = array(
571
				'facebook_page'       => $page_id,
572
				'facebook_profile'    => null
573
			);
574
		}
575
576
		Jetpack::load_xml_rpc_client();
577
		$xml = new Jetpack_IXR_Client();
578
		$xml->query( 'jetpack.setPublicizeOptions', $id, $options );
579
580
		if ( !$xml->isError() ) {
581
			$response = $xml->getResponse();
582
			Jetpack_Options::update_option( 'publicize_connections', $response );
583
		}
584
585
		$this->globalization();
586
	}
587
588
	function options_page_tumblr() {
589
		// Nonce check
590
		check_admin_referer( 'options_page_tumblr_' . $_REQUEST['connection'] );
591
592
		$connected_services = Jetpack_Options::get_option( 'publicize_connections' );
593
		$connection = $connected_services['tumblr'][$_POST['connection']];
594
		$options_to_show = $connection['connection_data']['meta']['options_responses'];
595
		$request = $options_to_show[0];
596
597
		$blogs = $request['response']['user']['blogs'];
598
599
		$blog_selected = false;
600
601
		if ( !empty( $connection['connection_data']['meta']['tumblr_base_hostname'] ) ) {
602
			foreach ( $blogs as $blog ) {
603
				if ( $connection['connection_data']['meta']['tumblr_base_hostname'] == $this->get_basehostname( $blog['url'] ) ) {
604
					$blog_selected = $connection['connection_data']['meta']['tumblr_base_hostname'];
605
					break;
606
				}
607
			}
608
609
		}
610
611
		// Use their Primary blog if they haven't selected one yet
612
		if ( !$blog_selected ) {
613
			foreach ( $blogs as $blog ) {
614
				if ( $blog['primary'] )
615
					$blog_selected = $this->get_basehostname( $blog['url'] );
616
			}
617
		} ?>
618
619
		<div id="thickbox-content">
620
621
			<?php
622
			ob_start();
623
			Publicize_UI::connected_notice( 'Tumblr' );
624
			$update_notice = ob_get_clean();
625
626
			if ( ! empty( $update_notice ) )
627
				echo $update_notice;
628
			?>
629
630
			<p><?php printf(
631
				esc_html__( 'Publicize to my %s:', 'jetpack' ),
632
				'<strong>' . esc_html__( 'Tumblr blog', 'jetpack' ) . '</strong>'
633
			); ?></p>
634
635
			<ul id="option-tumblr-blog">
636
637
			<?php
638
			foreach ( $blogs as $blog ) {
639
				$url = $this->get_basehostname( $blog['url'] ); ?>
640
				<li>
641
					<input type="radio" name="option" data-type="blog" id="<?php echo esc_attr( $url ) ?>" value="<?php echo esc_attr( $url ) ?>" <?php checked( $blog_selected == $url, true ); ?> />
642
					<label for="<?php echo esc_attr( $url ) ?>"><span class="name"><?php echo esc_html( $blog['title'] ) ?></span></label>
643
				</li>
644
			<?php } ?>
645
646
			</ul>
647
648
			<?php Publicize_UI::global_checkbox( 'tumblr', $_REQUEST['connection'] ); ?>
649
650
			<p style="text-align: center;">
651
				<input type="submit" value="<?php esc_attr_e( 'OK', 'jetpack' ) ?>" class="button tumblr-options save-options" name="save" data-connection="<?php echo esc_attr( $_REQUEST['connection'] ); ?>" rel="<?php echo wp_create_nonce( 'save_tumblr_blog_' . $_REQUEST['connection'] ) ?>" />
652
			</p> <br />
653
		</div>
654
655
		<?php
656
	}
657
658
	function get_basehostname( $url ) {
659
		return parse_url( $url, PHP_URL_HOST );
660
	}
661
662
	function options_save_tumblr() {
663
		// Nonce check
664
		check_admin_referer( 'save_tumblr_blog_' . $_REQUEST['connection'] );
665
666
		$id = $_POST['connection'];
667
668
		$options = array( 'tumblr_base_hostname' => $_POST['selected_id'] );
669
670
		Jetpack::load_xml_rpc_client();
671
		$xml = new Jetpack_IXR_Client();
672
		$xml->query( 'jetpack.setPublicizeOptions', $id, $options );
673
674
		if ( !$xml->isError() ) {
675
			$response = $xml->getResponse();
676
			Jetpack_Options::update_option( 'publicize_connections', $response );
677
		}
678
679
		$this->globalization();
680
	}
681
682
	function options_page_twitter() { Publicize_UI::options_page_other( 'twitter' ); }
683
	function options_page_linkedin() { Publicize_UI::options_page_other( 'linkedin' ); }
684
	function options_page_path() { Publicize_UI::options_page_other( 'path' ); }
685
	function options_page_google_plus() { Publicize_UI::options_page_other( 'google_plus' ); }
686
687
	function options_save_twitter() { $this->options_save_other( 'twitter' ); }
688
	function options_save_linkedin() { $this->options_save_other( 'linkedin' ); }
689
	function options_save_path() { $this->options_save_other( 'path' ); }
690
	function options_save_google_plus() { $this->options_save_other( 'google_plus' ); }
691
692
	function options_save_other( $service_name ) {
693
		// Nonce check
694
		check_admin_referer( 'save_' . $service_name . '_token_' . $_REQUEST['connection'] );
695
		$this->globalization();
696
	}
697
698
	/**
699
	* Already-published posts should not be Publicized by default. This filter sets checked to
700
	* false if a post has already been published.
701
	*/
702
	function publicize_checkbox_default( $checked, $post_id, $name, $connection ) {
703
		if ( 'publish' == get_post_status( $post_id ) )
704
			return false;
705
706
		return $checked;
707
	}
708
709
	/**
710
	* If there's only one shared connection to Twitter set it as twitter:site tag.
711
	*/
712
	function enhaced_twitter_cards_site_tag( $tag ) {
713
		$custom_site_tag = get_option( 'jetpack-twitter-cards-site-tag' );
714
		if( ! empty( $custom_site_tag ) )
715
			return $tag;
716
		if ( ! $this->is_enabled('twitter') )
717
			return $tag;
718
		$connections = $this->get_connections( 'twitter' );
719
		foreach ( $connections as $connection ) {
720
			$connection_meta = $this->get_connection_meta( $connection );
721
			if ( 0 == $connection_meta['connection_data']['user_id'] ) {
722
				// If the connection is shared
723
				return $this->get_display_name( 'twitter', $connection );
724
			}
725
		}
726
		return $tag;
727
	}
728
729
	function save_publicized_twitter_account( $submit_post, $post_id, $service_name, $connection ) {
730
		if ( 'twitter' == $service_name && $submit_post ) {
731
			$connection_meta = $this->get_connection_meta( $connection );
732
			$publicize_twitter_user = get_post_meta( $post_id, '_publicize_twitter_user' );
733
			if ( empty( $publicize_twitter_user ) || 0 != $connection_meta['connection_data']['user_id'] ) {
734
				update_post_meta( $post_id, '_publicize_twitter_user', $this->get_display_name( 'twitter', $connection ) );
735
			}
736
		}
737
	}
738
739
	function get_publicized_twitter_account( $account, $post_id ) {
740
		if ( ! empty( $account ) ) {
741
			return $account;
742
		}
743
		$account = get_post_meta( $post_id, '_publicize_twitter_user', true );
744
		if ( ! empty( $account ) ) {
745
			return $account;
746
		}
747
		return '';
748
	}
749
750
	/**
751
	* Save the Publicized Facebook account when publishing a post
752
	* Use only Personal accounts, not Facebook Pages
753
	*/
754
	function save_publicized_facebook_account( $submit_post, $post_id, $service_name, $connection ) {
755
		$connection_meta = $this->get_connection_meta( $connection );
756
		if ( 'facebook' == $service_name && isset( $connection_meta['connection_data']['meta']['facebook_profile'] ) && $submit_post ) {
757
			$publicize_facebook_user = get_post_meta( $post_id, '_publicize_facebook_user' );
758
			if ( empty( $publicize_facebook_user ) || 0 != $connection_meta['connection_data']['user_id'] ) {
759
				$profile_link = $this->get_profile_link( 'facebook', $connection );
760
761
				if ( false !== $profile_link ) {
762
					update_post_meta( $post_id, '_publicize_facebook_user', $profile_link );
763
				}
764
			}
765
		}
766
	}
767
}
768