Montag, Mai 25, 2020

wp_rewrite in ein WordPress-Plugin

Ok, ich habe diesen code, ich habe mit ausspucken news zu einer Anwendung von mir. Es hat funktioniert, bis heute. Ich habe Aussparung, um die Logik in den folgenden code, um es simpiler. Aber es sollte „ARBEITEN“ Kann mir jemand helfen diesen code beheben, wo es funktioniert und richtig gemacht wird? Ich weiß, es ist gehackt zusammen , aber es schien keine Probleme zu haben, bis heute. Ich habe nicht aktualisiert, nichts, weiß nicht, was der deal ist.



 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') );
}
  • Ich im Grunde nur brauchen, um in der Lage sein, den input zu nehmen von einer URL und Ausgang einige JSON-Daten.
InformationsquelleAutor Brad | 2010-02-05

1 Kommentar

  1. 20

    Änderte ich ein wenig von euren code in den Prozess, aber dies war für mich:

    <?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') );

    Ich habe kommentiert die wichtigen Teile, aber was ich Tat, war im Grunde bewegen Sie Ihren Haken über use_filter eher als add_action. Ich zog auch die Filter in der Reihenfolge, die Sie auch tatsächlich benutzt WordPress. Schien die Sache zu tun zu der Zeit.

    Schließlich, stellen Sie sicher, dass Ihre permalinks verwenden pretty URLs. Ich hatte ein Problem, wo meine waren auf default eingestellt, das macht WordPress ignorieren, die rewrite-Bedingungen, die Sie sonst benötigen, zu analysieren. Ändern Sie über einige hübsche URLs und Ihre Bedingungen zu aktualisieren.

    Lassen Sie mich wissen, ob das funktioniert für Sie. Hoffe, das hilft.

    Dank, Joe

    • Vielen Dank für diese, ich Teste es jetzt! Eine Frage, was wäre eine richtige Art und Weise der Prüfung die $wp_rewrite Regeln, um zu sehen, wenn es aktiv ist?
    • Es ist in der Regel genug, um Ihre URL aufrufen w/o umschreiben und mit ihm (/index.php?MyPlugin= “ foo “ und “ /MyPlugin/foo), und verwenden Sie ein wenig Versuch und Irrtum. Wenn nicht, wird der code umgeschrieben werden in wp-includes/rewrite.php. Ist es nicht schön, noch einfach zu Debuggen mit code in dieser Datei, obwohl.
    • ich weiß, das ist alt, aber ich Frage mich, ob dieser Ansatz kann nun aktualisiert werden, mit flush_rewrite_rules() jetzt?
    • zu mir..sieht ja

Kostenlose Online-Tests