Rewrite rules for short URL

时间:2015-12-31 作者:Ghazanfar Mir

Requirement

我已实施Document Short URL 允许用户使用其唯一ID访问服务器上的PDF文档,而不知道其完整路径。

文档是PDF文件,所以应该在浏览器中打开它们。这是可行的,所以这不是问题所在。

For example

http://www.example.com/INV0001-00-001
其中INV0001-00-001是Unique ID

My Attempt

add_action(\'init\', \'pins_add_rewrite_rule\', 11);

add_action(\'template_redirect\', \'pins_short_url_redirect\');

function pins_add_rewrite_rule() {

    add_rewrite_rule(\'^document/(.*)$\', \'index.php/?action=short_url&id=$1\', \'top\'); // works
    add_rewrite_rule(\'^document/(.*)$\', \'index.php?action=short_url&id=$1\', \'top\'); // doesn\'t work
    flush_rewrite_rules();

    global $wp;
    $wp->add_query_var(\'action\');
    $wp->add_query_var(\'id\');

}


function pins_short_url_redirect() {

    global $wp_query;
    if (empty($wp_query->query_vars[\'action\'])) {
        return;
    }
    $action = $wp_query->query_vars[\'action\'];


    if ($action == \'short_url\') {
        require_once \'classes/class-short-url.php\';
        if(class_exists(\'PINS_Short_Document_URL\')){
            PINS_Short_Document_URL::init(); // class responsible for pulling the ID and serve the pdf document in browser
            // We are done
            die();
        }
    }
}

My Questions

<我做得对吗?还有更好的建议吗add_rewrite_rule 工作,而不是其他?如果在索引后删除“/”。php它不工作。为什么enter image description here

1 个回复
最合适的回答,由SO网友:Milo 整理而成

有两种类型的重写规则可以通过API和add_rewrite_rule: internal 规则和external 规则。将外部规则插入到.htaccess 文件,并且必须采用Apache的mod_rewrite. 内部规则被添加到WordPress内部重写规则数组中,并且必须采用API可以通过PHP解析的格式。

WordPress通过查看add_rewrite_rule. 内部规则必须指向index.php, 通过查询字符串附加查询变量。任何不指向index.php 假定为外部规则。

您的规则存在的问题是,您混合了内部和外部格式。我假设第一条规则有效,因为尾部的斜杠混淆了解析器,它被添加为外部规则。第二条规则不起作用,因为它被解释为内部规则,但使用$1 而不是$matches[1] 访问捕获的匹配项。

考虑到这些因素,此规则应作为内部规则:

add_action(\'init\', \'pins_add_rewrite_rule\', 11);
function pins_add_rewrite_rule() {
    add_rewrite_rule(
        \'^document/(.*)$\',
        \'index.php?action=short_url&id=$matches[1]\',
        \'top\'
    );
}
至于拦截这些请求,您可以挂接在查询数据库之前运行的更早的操作,以便以更少的开销更快地完成这些请求。

add_action( \'parse_query\', \'pins_short_url_redirect\' );
function pins_short_url_redirect( $wp_query ) {
    if( isset( $wp_query->query_vars[\'action\'] ) && \'short_url\' == $wp_query->query_vars[\'action\'] ){
        // output file here
        die();
    }
}
其他一些位:

使用query_vars 筛选以添加查询变量,而不是访问$wp 对象直接位于init.

action 已经是WordPress查询变量,我不知道重新注册它是否会有任何负面影响,最好是安全的,并使用一些您知道是唯一的,例如ghazanfar_action. 你可能也应该这样做id.

不要在每个请求上刷新重写规则。只有当您知道重写内容已更改时,才应刷新它们。您可以在插件激活时刷新,也可以通过访问admin中的Permalinks设置页面快速刷新以进行测试。看见flush_rewrite_rules 了解更多信息。

相关推荐