WordPress 插件中的 wp_rewrite

Posted

技术标签:

【中文标题】WordPress 插件中的 wp_rewrite【英文标题】:wp_rewrite in a WordPress Plugin 【发布时间】:2011-01-13 17:27:00 【问题描述】:

好的,我有这段代码,我一直用它来向我的应用程序发送新闻。它一直工作到今天。我已经删除了以下代码中的所有逻辑以使其更简单。但它应该“工作”有人可以帮我将此代码修复到它工作的地方,并且做得对吗?我知道它是一起被黑的,但直到今天它似乎没有任何问题。我没有更新任何东西,不知道交易是什么。



 Plugin Name:   MyPlugin Example
 Version:       1.0.1


If ( ! class_exists("MyPlugin") )

    class MyPlugin
    
        var $db_version = "1.0"; //not used yet

        function init()
        
   //Nothing as of now.
        
        function activate()
        
            global $wp_rewrite;
            $this->flush_rewrite_rules();
        

        function pushoutput( $id )
        
            $output->out =' The output worked!';
            $this->output( $output );

        
        function output( $output )
        
            ob_start();
            ob_end_clean();
            header( 'Cache-Control: no-cache, must-revalidate' );
            header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );
            header( 'Content-type: application/json' );

            echo json_encode( $output );
            //Must encode this...
        

        function flush_rewrite_rules()
        
            global $wp_rewrite;
            $wp_rewrite->flush_rules();
        

        function createRewriteRules( $rewrite )
        
            global $wp_rewrite;
            $new_rules = array( 'MyPlugin/(.+)' => 'index.php?MyPlugin=' . $wp_rewrite->preg_index(1) );
            if ( ! is_array($wp_rewrite->rules) )
            
                $wp_rewrite->rules = array();
            
            $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
            return $wp_rewrite;
        


        function add_query_vars( $qvars )
        
            $qvars[] = 'MyPlugin';
            return $qvars;
        
        function template_redirect_intercept()
        
            global $wp_query;
            if ( $wp_query->get('MyPlugin') )
            
                $id = $wp_query->query_vars['MyPlugin'];
                $this->pushoutput( $id );


                exit;
            
        
    

If ( class_exists("MyPlugin") )

    $MyPluginCode = new MyPlugin();

If ( isset($MyPluginCode) )

    register_activation_hook( __file__, array($MyPluginCode, 'activate') );
    add_action( 'admin-init', array(&$MyPluginCode, 'flush_rewrite_rules') );
    //add_action( 'init', array(&$MyPluginCode, 'init') );
    add_action( 'generate_rewrite_rules', array(&$MyPluginCode, 'createRewriteRules') );

    add_action( 'template_redirect', array(&$MyPluginCode, 'template_redirect_intercept') );
    // add_filter( 'query_vars', array(&$MyPluginCode, 'add_query_vars') );


【问题讨论】:

我基本上只需要能够从 URL 中获取输入并输出一些 JSON 数据。 【参考方案1】:

我在此过程中更改了您的一些代码,但这对我有用:

<?php

/**
* Plugin Name:   MyPlugin Example
* Version:       1.0.1
**/
class MyPlugin 

    function activate() 
        global $wp_rewrite;
        $this->flush_rewrite_rules();
    

    // Took out the $wp_rewrite->rules replacement so the rewrite rules filter could handle this.
    function create_rewrite_rules($rules) 
        global $wp_rewrite;
        $newRule = array('MyPlugin/(.+)' => 'index.php?MyPlugin='.$wp_rewrite->preg_index(1));
        $newRules = $newRule + $rules;
        return $newRules;
    

    function add_query_vars($qvars) 
        $qvars[] = 'MyPlugin';
        return $qvars;
    

    function flush_rewrite_rules() 
        global $wp_rewrite;
        $wp_rewrite->flush_rules();
    

    function template_redirect_intercept() 
        global $wp_query;
        if ($wp_query->get('MyPlugin')) 
            $this->pushoutput($wp_query->get('MyPlugin'));
            exit;
        
    

    function pushoutput($message) 
        $this->output($message);
    

    function output( $output ) 
        header( 'Cache-Control: no-cache, must-revalidate' );
        header( 'Expires: Mon, 26 Jul 1997 05:00:00 GMT' );

        // Commented to display in browser.
        // header( 'Content-type: application/json' );

        echo json_encode( $output );
    


$MyPluginCode = new MyPlugin();
register_activation_hook( __file__, array($MyPluginCode, 'activate') );

// Using a filter instead of an action to create the rewrite rules.
// Write rules -> Add query vars -> Recalculate rewrite rules
add_filter('rewrite_rules_array', array($MyPluginCode, 'create_rewrite_rules'));
add_filter('query_vars',array($MyPluginCode, 'add_query_vars'));

// Recalculates rewrite rules during admin init to save resourcees.
// Could probably run it once as long as it isn't going to change or check the
// $wp_rewrite rules to see if it's active.
add_filter('admin_init', array($MyPluginCode, 'flush_rewrite_rules'));
add_action( 'template_redirect', array($MyPluginCode, 'template_redirect_intercept') );

我已经评论了重要的部分,但我所做的基本上是将你的钩子移到use_filter而不是add_action。我还将过滤器移动到它们在 Wordpress 中实际使用的顺序中。当时似乎是要做的事情。

最后,确保您的永久链接设置为使用漂亮的 URL。我遇到了一个问题,我的设置为默认值,这使得 Wordpress 忽略了它需要解析的任何重写条件。切换到一些漂亮的 URL,你的条件就会刷新。

让我知道这是否适合您。希望对您有所帮助。

谢谢,乔

【讨论】:

谢谢你,我正在测试它!一个问题,测试 $wp_rewrite 规则以查看它是否处于活动状态的正确方法是什么? 通常只需要调用你的 URL 而无需重写(/index.php?MyPlugin=foo 和 /MyPlugin/foo)并使用一些试验和错误。如果没有,重写代码在 wp-includes/rewrite.php 中。不过,使用该文件中的代码进行调试并不容易。 我知道这是旧的,但我想知道现在是否可以使用 flush_rewrite_rules() 更新这种方法?

以上是关于WordPress 插件中的 wp_rewrite的主要内容,如果未能解决你的问题,请参考以下文章

板邓:wordpress如何使用wp_rewrite实现自定义伪静态,非301重定向。

在WordPress中更新permalinks

Wordpress基于日期的分类归档

php WP_Rewrite端点演示

WP - wp_rewrite 页面 404

优化 WordPress 插件“更好的 WordPress 最近评论”中的慢查询