PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 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 / modules / theme-tools / random-redirect.php
jetpack / modules / theme-tools Last commit date
compat 2 months ago content-options 1 month ago js 6 years ago responsive-videos 1 year ago site-logo 8 months ago social-menu 2 months ago content-options.php 8 months ago featured-content.php 8 months ago random-redirect.php 5 days ago responsive-videos.php 8 months ago site-breadcrumbs.php 1 year ago site-logo.php 8 months ago social-links.php 8 months ago social-menu.php 8 months ago
random-redirect.php
139 lines
1 <?php
2 /**
3 * Plugin Name: Random Redirect
4 * Plugin URI: https://wordpress.org/extend/plugins/random-redirect/
5 * Description: Allows you to create a link to yourblog.example.com/?random which will redirect someone to a random post on your blog, in a StumbleUpon-like fashion.
6 * Version: 1.2-wpcom
7 * Author: Matt Mullenweg
8 * Author URI: https://ma.tt/
9 * Text Domain: jetpack
10 *
11 * @package automattic/jetpack
12 */
13
14 // phpcs:disable WordPress.Security.NonceVerification -- No changes to the site here, it just redirects.
15
16 /*
17 * This module was removed from the plugin in 13.6 and restored in 16.1. In the meantime some themes
18 * and plugins started shipping their own copy of the function below, so only declare it when nothing
19 * else has, to avoid a fatal error. The declaration must stay inside this conditional: PHP binds
20 * unconditional top-level function declarations when the file is compiled, before any check could run.
21 */
22 if ( ! function_exists( 'jetpack_matt_random_redirect' ) ) {
23 /**
24 * Redirects to a random post on the site.
25 */
26 function jetpack_matt_random_redirect() {
27 /**
28 * Allows disabling the random redirect feature.
29 *
30 * @since 16.1
31 *
32 * @param bool $enabled Whether the random redirect feature is enabled. Default true.
33 */
34 if ( ! apply_filters( 'jetpack_random_redirect_enabled', true ) ) {
35 return;
36 }
37
38 // Verify that the Random Redirect plugin this code is from is not active
39 // See https://plugins.trac.wordpress.org/ticket/1898
40 if ( ! ( defined( 'IS_WPCOM' ) && IS_WPCOM ) ) {
41 require_once ABSPATH . 'wp-admin/includes/plugin.php';
42 if ( is_plugin_active( 'random-redirect/random-redirect.php' ) ) {
43 return;
44 }
45 }
46
47 // Acceptable URL formats: /[...]/?random=[post type], /?random, /&random, /&random=1
48 if ( ! isset( $_GET['random'] ) && ! ( isset( $_SERVER['REQUEST_URI'] ) && in_array( strtolower( $_SERVER['REQUEST_URI'] ), array( '/&random', '/&random=1' ), true ) ) ) {
49 return;
50 }
51
52 // Ignore POST requests.
53 if ( ! empty( $_POST ) ) {
54 return;
55 }
56
57 // Persistent AppEngine abuse. ORDER BY RAND is expensive.
58 if ( isset( $_SERVER['HTTP_USER_AGENT'] ) && strstr( filter_var( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ), 'AppEngine-Google' ) ) {
59 wp_die( 'Please <a href="https://en.support.wordpress.com/contact/" rel="noopener noreferrer" target="_blank">contact support</a>' );
60 }
61
62 $where = array(
63 "post_password = ''",
64 "post_status = 'publish'",
65 );
66 $where_args = array();
67
68 // Set default post type.
69 $post_type = get_post_type();
70
71 // Change the post type if the parameter is set.
72 if ( isset( $_GET['random_post_type'] ) && post_type_exists( sanitize_key( $_GET['random_post_type'] ) ) ) {
73 $post_type = sanitize_key( $_GET['random_post_type'] );
74 }
75
76 // Don't show a random page if 'page' isn't specified as the post type specifically.
77 if ( 'page' === $post_type && is_front_page() && ! isset( $_GET['random_post_type'] ) ) {
78 $post_type = 'post';
79 }
80
81 $where[] = 'p.post_type = %s';
82 $where_args[] = $post_type;
83
84 // Set author name if we're on an author archive.
85 if ( is_author() ) {
86 $where[] = 'post_author = %s';
87 $where_args[] = get_the_author_meta( 'ID' );
88 }
89
90 // Set default category type
91 if ( is_category() ) {
92 $category = get_the_category();
93 if ( isset( $category ) && ! empty( $category ) ) {
94 $random_cat_id = $category[0]->term_id;
95 }
96 }
97
98 // Set the category ID if the parameter is set.
99 if ( isset( $_GET['random_cat_id'] ) ) {
100 $random_cat_id = (int) $_GET['random_cat_id'];
101 }
102
103 global $wpdb;
104
105 $where = implode( ' AND ', $where );
106
107 // Pick a post via COUNT plus a random OFFSET rather than ORDER BY RAND(), which randomizes and sorts every candidate row on each request.
108 if ( isset( $random_cat_id ) ) {
109 $from_where = "FROM $wpdb->posts AS p INNER JOIN $wpdb->term_relationships AS tr ON (p.ID = tr.object_id AND tr.term_taxonomy_id = %s) INNER JOIN $wpdb->term_taxonomy AS tt ON(tr.term_taxonomy_id = tt.term_taxonomy_id AND taxonomy = 'category') WHERE $where";
110 $query_args = array_merge( array( $random_cat_id ), $where_args );
111 } else {
112 $from_where = "FROM $wpdb->posts AS p WHERE $where";
113 $query_args = $where_args;
114 }
115
116 // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
117 $post_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( DISTINCT p.ID ) $from_where", ...$query_args ) );
118
119 if ( $post_count < 1 ) {
120 return;
121 }
122
123 $query_args[] = wp_rand( 0, $post_count - 1 );
124 // phpcs:ignore WordPress.DB.DirectDatabaseQuery, WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.ReplacementsWrongNumber, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare
125 $random_id = $wpdb->get_var( $wpdb->prepare( "SELECT DISTINCT p.ID $from_where ORDER BY p.ID LIMIT 1 OFFSET %d", ...$query_args ) );
126
127 if ( ! $random_id ) {
128 return;
129 }
130
131 // @phan-suppress-next-line PhanTypeMismatchArgument
132 $permalink = get_permalink( $random_id );
133 wp_safe_redirect( $permalink );
134 exit( 0 );
135 }
136
137 add_action( 'template_redirect', 'jetpack_matt_random_redirect' );
138 }
139