动态添加WP重写规则

时间:2018-08-21 01:57:42

标签: wordpress url-rewriting

我在一个客户的特殊情况下,我们想要一个位置短代码,该短代码根据URL中提供的位置显示动态内容。

例如:www.sitename.com/US

这不是实际页面,而是www.sitename.com的版本,其中包含与美国相关的信息

在这种情况下,存在两种具有挑战性的方案。

1-我们需要它们成为永久链接,因为我们想在Google中列出它们。因此?location = US无法正常工作。

2-短代码可以在具有选定模板的任何页面上,因此无法实际分配静态重写规则。

我实施了一个解决方案,其中将为每个具有所选模板的页面自动添加一个重写规则。

这很好用。我只是想寻求帮助,以查看是否可以采用更好的方法来完成此操作,或者该方法是否存在任何缺点。

<?php


if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly

class RegisterLocationRewriteRule
{

/**
 * Start up
 */
function __construct()
{

    /* Rewrite Rules for the location shortcode */
    add_action('init', array( $this, 'register_location_rewrite_tag' ), 10, 0);

    /* Rewrite rule tag */      
    add_action('init', array( $this, 'register_location_rewrite_rule' ), 10, 0);

}

/**
 * Register the location tag in urls
 *
 * @return none
 * @author Fahad Sheikh
 **/
public function register_location_rewrite_tag() {

    // Added a rewrite tag for the location attribute 
    add_rewrite_tag('%location%', '([^&]+)');
}

/**
 * Register the location rewrite rule
 *
 * @return none
 * @author Fahad Sheikh
 **/
public function register_location_rewrite_rule() {

    // args to get all pages with the selected template
    $args = array(
        'post_type' => 'page',
        'posts_per_page' => -1,
        'meta_query' => array(
            array(
                'key' => '_wp_page_template',
                'value' => 'template-path/template-name.php'
            )
        )
    );

    // get all pages with the selected template 
    $the_pages = new WP_Query( $args );

    // for each page with the selected template add the rewrite rule 
    // that accepts the location attribute
    if( $the_pages->have_posts() ){
        while( $the_pages->have_posts() ){
            $the_pages->the_post();
            add_rewrite_rule('^'.$the_pages->post- 
>post_name.'/([^/]*)?','index.php? 
   page_id='.get_the_ID().'&location=$matches[1]','top');
            }
        }
        wp_reset_postdata();
    }
}

new RegisterLocationRewriteRule();

0 个答案:

没有答案