以下内容尚未准备好生产。这是概念的工作证明。
我只是在这里思考。您可以创建一个新表(请参阅Creating Tables with Plugins 与requested_url 键和shortened_url 值。整个系统将基于该方法。
首先,我们在数据库中创建一个自定义表,如果它不存在的话。该表将用于存储我们的网址。
<?php
add_action( 'after_switch_theme', function () {
global $wpdb;
$table_name = $wpdb->prefix . 'wpso74035985';
$charset_collate = $wpdb->get_charset_collate();
$create_ddl = "CREATE TABLE IF NOT EXISTS $table_name (
id mediumint(9) NOT NULL AUTO_INCREMENT,
requested_url varchar(55) DEFAULT '' NOT NULL,
shortened_url varchar(55) DEFAULT '' NOT NULL,
PRIMARY KEY (id)
) $charset_collate;";
require_once ABSPATH . 'wp-admin/includes/upgrade.php';
maybe_create_table( $table_name, $create_ddl );
} );
然后我们可以通过解析$_SERVER['QUERY_STRING'] 并通过get_query_var() 验证url 完整性来检索请求的url,因为它只检索public query variables that are recognized by WP_Query。
然后我们将在表中搜索请求的 url,如果它不存在,则设置一个新的密钥对值。
<?php
add_action( 'pre_get_posts', function ( $wp_query ) {
if ( ! is_admin() && $wp_query->is_main_query() ) {
if ( $wp_query->is_search() ) {
global $wp;
parse_str( $_SERVER['QUERY_STRING'], $variables );
$buffer = array();
foreach ( $variables as $variable => $value ) {
if ( get_query_var( $variable ) ) {
array_push( $buffer, array( $variable => $value ) );
};
};
$buffer = array_reduce( $buffer, 'array_merge', array() );
$requested_url = esc_url_raw( add_query_arg( $buffer, home_url( $wp->request ) ) );
global $wpdb;
$table_name = $wpdb->prefix . 'wpso74035985';
$results = $wpdb->get_results(
"SELECT * FROM $table_name"
);
$needle_key = array_search( $requested_url, array_column( $results, 'requested_url' ) );
if ( $needle_key === false ) {
$shortened_url = 'ptty' . substr( md5( $requested_url . uniqid( '', true ) ), 0, 12 );
$wpdb->insert(
$table_name,
array(
'requested_url' => sanitize_url( $requested_url ),
'shortened_url' => sanitize_url( home_url( $shortened_url ) ),
)
);
};
};
};
} );
通过template_redirect 钩子,我们可以根据我们的表格检查缩短的url,并根据它进行重定向。
add_action( 'template_redirect', function () {
if ( is_404() ) {
global $wp;
if ( 'ptty' === substr( $wp->request, 0, 4 ) ) {
$shortened_url = home_url( $wp->request );
global $wpdb;
$table_name = $wpdb->prefix . 'wpso74035985';
$results = $wpdb->get_results(
"SELECT * FROM $table_name"
);
$needle_key = array_search( $shortened_url, array_column( $results, 'shortened_url' ) );
if ( $needle_key !== false ) {
$location = $results[$needle_key]->requested_url;
wp_safe_redirect( $location );
exit();
};
};
};
} );
当我们首先检查 404 到 is_404() 时(几乎限制了空请求的数量),您还应该在根目录中包含 404.php。
现在,在你开始生产之前需要了解一些事情,即使我们通过md5() 和uniqid() 生成一个伪随机字符串,它们实际上并不是完全随机的,所以你最终可能会遇到问题两个缩短的网址相同的地方。您可以执行一个 while 循环,并在使用之前不断检查该缩短的 url 是否已经存在。