PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 2.9.6
Jetpack – WP Security, Backup, Speed, & Growth v2.9.6
15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / functions.twitter-cards.php
jetpack Last commit date
3rd-party 10 years ago _inc 10 years ago languages 10 years ago modules 5 years ago views 10 years ago .svnignore 10 years ago class.jetpack-bbpress-json-api-compat.php 10 years ago class.jetpack-cli.php 10 years ago class.jetpack-client-server.php 10 years ago class.jetpack-client.php 10 years ago class.jetpack-data.php 10 years ago class.jetpack-debugger.php 10 years ago class.jetpack-error.php 10 years ago class.jetpack-heartbeat.php 10 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-network-sites-list-table.php 10 years ago class.jetpack-network.php 10 years ago class.jetpack-options.php 10 years ago class.jetpack-post-images.php 10 years ago class.jetpack-signature.php 10 years ago class.jetpack-sync.php 10 years ago class.jetpack-user-agent.php 10 years ago class.jetpack-xmlrpc-server.php 10 years ago class.jetpack.php 10 years ago class.json-api-endpoints.php 3 years ago class.json-api.php 10 years ago class.media-extractor.php 10 years ago class.media-summary.php 10 years ago class.photon.php 10 years ago composer.json 10 years ago functions.compat.php 10 years ago functions.gallery.php 10 years ago functions.opengraph.php 10 years ago functions.photon.php 10 years ago functions.twitter-cards.php 10 years ago jetpack.php 3 years ago locales.php 10 years ago readme.txt 3 years ago require-lib.php 10 years ago uninstall.php 10 years ago
functions.twitter-cards.php
139 lines
1 <?php
2
3 /* Twitter Cards
4 *
5 * Hooks onto the Open Graph protocol and extends it by adding only the tags
6 * we need for twitter cards.
7 *
8 * @see /wp-content/blog-plugins/open-graph.php
9 * @see https://dev.twitter.com/docs/cards
10 */
11 function wpcom_twitter_cards_tags( $og_tags ) {
12 global $post;
13
14 if( post_password_required() )
15 return $og_tags;
16
17 if ( apply_filters( 'jetpack_disable_twitter_cards', false ) )
18 return $og_tags;
19
20 /*
21 * These tags apply to any page (home, archives, etc)
22 */
23
24 $og_tags['twitter:site'] = ( defined('IS_WPCOM') && IS_WPCOM ) ? '@wordpressdotcom' : '@jetpack';
25
26 if ( ! is_singular() || ! empty( $og_tags['twitter:card'] ) )
27 return $og_tags;
28
29 /*
30 * The following tags only apply to single pages.
31 */
32
33 $card_type = 'summary';
34
35 // Try to give priority to featured images
36 if ( class_exists('Jetpack_PostImages') ) {
37 $featured = Jetpack_PostImages::from_thumbnail( $post->ID, 240, 240 );
38 if ( !empty( $featured ) && count( $featured ) > 0 ) {
39 if ( (int) $featured[0]['src_width'] >= 280 && (int) $featured[0]['src_height'] >= 150 ) {
40 $card_type = 'summary_large_image';
41 $og_tags['twitter:image:src'] = add_query_arg( 'w', 640, $featured[0]['src'] );
42 } else {
43 $og_tags['twitter:image'] = add_query_arg( 'w', 240, $featured[0]['src'] );
44 }
45 }
46 }
47
48 // Only proceed with media analysis if a featured image has not superseded it already.
49 if ( empty( $og_tags['twitter:image'] ) && empty( $og_tags['twitter:image:src'] ) ) {
50 if ( ! class_exists( 'Jetpack_Media_Summary' ) && defined('IS_WPCOM') && IS_WPCOM )
51 include WP_CONTENT_DIR . '/lib/class.wpcom-media-summary.php';
52
53 // Test again, class should already be auto-loaded in Jetpack.
54 // If not, skip extra media analysis and stick with a summary card
55 if ( class_exists( 'Jetpack_Media_Summary' ) ) {
56 $extract = Jetpack_Media_Summary::get( $post->ID );
57
58 if ( 'gallery' == $extract['type'] ) {
59 list( $og_tags, $card_type ) = wpcom_twitter_cards_define_type_based_on_image_count( $og_tags, $extract );
60 } else if ( 'video' == $extract['type'] ) {
61 // Leave as summary, but with large pict of poster frame (we know those comply to Twitter's size requirements)
62 $card_type = 'summary_large_image';
63 $og_tags['twitter:image:src'] = add_query_arg( 'w', 640, $extract['image'] );
64 } else {
65 list( $og_tags, $card_type ) = wpcom_twitter_cards_define_type_based_on_image_count( $og_tags, $extract );
66 }
67 }
68 }
69
70 $og_tags['twitter:card'] = $card_type;
71
72 // If we have information on the author/creator, then include that as well
73 if ( ! empty( $post ) && ! empty( $post->post_author ) ) {
74 $handle = apply_filters( 'jetpack_sharing_twitter_via', '', $post->ID );
75 if ( !empty( $handle ) && 'wordpressdotcom' != $handle )
76 $og_tags['twitter:creator'] = '@' . $handle;
77 }
78
79 // Make sure we have a description for Twitter, their validator isn't happy without some content (single space not valid).
80 if ( ! isset( $og_tags['og:description'] ) || '' == trim( $og_tags['og:description'] ) ) { // empty( trim( $og_tags['og:description'] ) ) isn't valid php
81 $has_creator = ( !empty($og_tags['twitter:creator']) && '@wordpressdotcom' != $og_tags['twitter:creator'] ) ? true : false;
82 if ( 'photo' == $card_type )
83 $og_tags['twitter:description'] = ( $has_creator ) ? sprintf( __('Photo post by %s.', 'jetpack'), $og_tags['twitter:creator'] ) : __('Photo post.', 'jetpack');
84 else if ( !empty( $extract ) && 'video' == $extract['type'] ) // use $extract['type'] since $card_type is 'summary' for video posts
85 $og_tags['twitter:description'] = ( $has_creator ) ? sprintf( __('Video post by %s.', 'jetpack'), $og_tags['twitter:creator'] ) : __('Video post.', 'jetpack');
86 else if ( 'gallery' == $card_type )
87 $og_tags['twitter:description'] = ( $has_creator ) ? sprintf( __('Gallery post by %s.', 'jetpack'), $og_tags['twitter:creator'] ) : __('Gallery post.', 'jetpack');
88 else
89 $og_tags['twitter:description'] = ( $has_creator ) ? sprintf( __('New post by %s.', 'jetpack'), $og_tags['twitter:creator'] ) : __('New post.', 'jetpack');
90 }
91
92 return $og_tags;
93 }
94
95 function wpcom_twitter_cards_define_type_based_on_image_count( $og_tags, $extract ) {
96 $card_type = 'summary';
97 $img_count = $extract['count']['image'];
98
99 if ( empty( $img_count ) ) {
100 // No images, use Blavatar as a thumbnail for the summary type.
101 if ( function_exists('blavatar_domain') ) {
102 $blavatar_domain = blavatar_domain(site_url());
103 if ( blavatar_exists( $blavatar_domain ) )
104 $og_tags['twitter:image'] = blavatar_url( $blavatar_domain, 'img', 240);
105 }
106 // Not falling back on Gravatar, because there's no way to know if we end up with an auto-generated one.
107 } else if ( 1 == $img_count && ( 'image' == $extract['type'] || 'gallery' == $extract['type'] ) ) {
108 // 1 image = photo
109 // Test for $extract['type'] to limit to image and gallery, so we don't send a potential fallback image like a Gravatar as a photo post.
110 $card_type = 'photo';
111 $og_tags['twitter:image'] = add_query_arg( 'w', 1400, ( empty( $extract['images'] ) ) ? $extract['image'] : $extract['images'][0]['url'] );
112 } else if ( $img_count <= 3 ) {
113 // 2-3 images = summary with small thumbnail
114 $og_tags['twitter:image'] = add_query_arg( 'w', 240, ( empty( $extract['images'] ) ) ? $extract['image'] : $extract['images'][0]['url'] );
115 } else if ( $img_count >= 4 ) {
116 // >= 4 images = gallery
117 $card_type = 'gallery';
118 $og_tags = wpcom_twitter_cards_gallery( $extract, $og_tags );
119 }
120
121 return array( $og_tags, $card_type );
122 }
123
124 function wpcom_twitter_cards_gallery( $extract, $og_tags ) {
125 foreach( $extract['images'] as $key => $value ) {
126 if ( $key > 3 )
127 break; // Can only send a max of 4 picts (https://dev.twitter.com/docs/cards/types/gallery-card)
128 $og_tags[ 'twitter:image' . $key ] = add_query_arg( 'w', 640, $value['url'] );
129 }
130 return $og_tags;
131 }
132
133 add_filter( 'jetpack_open_graph_tags', 'wpcom_twitter_cards_tags' );
134
135 function wpcom_twitter_cards_output( $og_tag ) {
136 return ( false !== strpos( $og_tag, 'twitter:' ) ) ? preg_replace( '/property="([^"]+)"/', 'name="\1"', $og_tag ) : $og_tag;
137 }
138
139 add_filter( 'jetpack_open_graph_output', 'wpcom_twitter_cards_output' );