【问题标题】:Creating pretty links for URLs with multiple query parameters为具有多个查询参数的 URL 创建漂亮的链接
【发布时间】:2022-10-12 21:43:08
【问题描述】:

我正在一个网站上工作,该网站更像是一个搜索目录,并且无法找到关于如何从具有多个查询参数(Wordpress)的长 URL 自动创建漂亮链接的明确答案。

例如,如果链接如下所示: website.com/search/search-results/?address=98101,+seattle,+washington&contractor=plumber&latitude=1234&longitude=9876&filter=20&order=distance

有没有办法让它看起来像这样:website.com/search/search-results/98101/seattle/washington/plumber/

自动无需遍历每个链接,并且新的漂亮链接将显示与具有所有查询参数的页面相同的页面?

在此先感谢,我整天都在努力解决这个问题,这不是我的强项......

【问题讨论】:

    标签: wordpress query-parameters pretty-urls


    【解决方案1】:

    非常有趣且非常技术性的问题。

    以下内容尚未准备好生产。这是概念的工作证明。

    我只是在这里思考。您可以创建一个新表(请参阅Creating Tables with Pluginsrequested_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 是否已经存在。

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2015-11-08
      • 2013-05-25
      • 2015-01-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多