Wie kann ich meine Umschreibregeln am Anfang hinzufügen, auf die richtige Seite redirect und die Regeln für die Aktivierung des Plugins löschen?

Hallo, ich schreibe gerade ein WordPress-Plugin, das ich veröffentlichen möchte. Ich habe jedoch ein paar Probleme mit URL-Umschreibungen.

Ich habe das Plugin, um auf die Plugin-Seite add_action('template_redirect', 'myfuncdisplay') um eine benutzerdefinierte Ausgabe anzuzeigen.

Ich habe auch die Umleitung funktioniert, www.mydomain.com/index.php?form=contact2 zum Beispiel www.mydomain.com/index.php?form=contact2 den template_redirect Code aufgerufen werden.

So weit, ist es gut. Wenn ich jedoch mydomain.com/form/contact gehe, wird es tatsächlich auf eine bestehende Seite mydomain.com/products/contact-centres umgeleitet.

Wenn ich zu mydomain.com/form/contact2 gehe, mydomain.com/form/contact2 es auf mein Plugin umgeleitet.

Beim Überprüfen des coolen Plugins Rewrite Analyzer erhalte ich Folgendes:

 form/([^/]+)/?$ formid: contact (.+?)(/[0-9]+)?/?$ pagename: form/contact page: 

Ich habe über den with code gespielt und den Parameter zu true hinzugefügt … jetzt scheint es zu funktionieren und ignoriert die Tatsache, dass ich andere Seiten mit contact gelistet habe, es geht jetzt einfach direkt zu meinem plugin:

 add_permastruct( 'formid', 'form/%formid%', true ); 

Ist das obige korrekt? Bedeutet das Einstellen des 3. Parameters Priorität für meinen Permalink? Soweit ich das beurteilen kann, wird WordPress versuchen, den Post-Namen zu finden und irgendeinen / meinen / anderen / URL / Post-Namen zu ignorieren … scheint dies auf allen Seiten zu tun, was ein wenig verwirrend ist.

Um zu erreichen, dass mein Plugin funktioniert, muss ich zu den Permalink-Optionen im Admin-Menü gehen und auf Speichern klicken … wenn ich das nicht tue, als ob meine Regeln nicht enthalten wären. Gibt es einen Weg dazu, kann es nicht durch das Plugin bei der Aktivierung getan werden oder muss ich meinen Plugin-Benutzern sagen, dass sie auf den Menüpunkt Permalinks klicken, um die Plugin-Weiterleitungen zu aktivieren?

Mein Code ist unten, schätzen Sie die Hilfe und Zeit für Ihre Antworten.

Chris

 registry[$id] = new $class();*/ } /* called each request */ public static function init() { self::$pluginPath = dirname(__FILE__); // Set Plugin Path self::$pluginUrl = WP_PLUGIN_URL . '/jformer-for-wp/'; // Set Plugin URL /* During the admin_menu action we can add our own items into WordPress' Administration menu. */ // add_action('admin_menu', array($this,'InsertAdminMenuLink')); // add_action('init', array($this,'RouteActions')); /* The next two functions run when our plugin is activated or deactivated. In these functions we run the code necessary to install, and possibly uninstall our plugin when the user activates or deactivates it from the Plugins page. */ register_activation_hook(__FILE__,'JFormerForWP::activate'); // Deactivation function register_deactivation_hook(__FILE__,'JFormerForWP::deactivate'); // This function runs on each page load to check if our plugin has been updated and, if so, what SQL functions we need to run to upgrade our plugin's tables to the most recent version // add_action('init', array($this, 'Update'),1); JFormerForWP::setRewriteRules(); /* add_filter( 'query_vars', 'JFormerForWP::addQueryVars'); */ add_action( 'template_redirect', 'JFormerForWP::formDisplay'); /* used when rewrite tags are used */ /* Often times, our plugins need to attach new javascript files or css files to our page. WordPress provides a very clean mechanism for doing so that helps prevent us from needlessly including the same file multiple times (which would slow down your page load time). Scroll down to the StylesAndScripts function to see how to properly attach a JavaScript or CSS file. */ add_action('wp_print_styles', 'JFormerForWP::styles'); add_action('wp_print_scripts', 'JFormerForWP::scripts'); add_shortcode('jformer', 'JFormerForWP::shortcodeHandler'); /* for ajax functionality */ add_action('wp_ajax_nopriv_jFormerForWp', 'JFormerForWP::ajaxHandler'); add_action('wp_ajax_jFormerForWp', 'JFormerForWP::ajaxHandler'); // add_action('wp_jformer-for-wp_ajax_get', array($this, 'handle_ajax')); self::$errors = new WP_Error(); } public static function ajaxHandler() { $formID = $_POST['jFormerId']; echo JFormerForWP::getForm($formID); } public static function registerForms() { /* $files = array(); $path = getcwd(); $supported_ext = array('gif', 'jpg', 'jpeg'); $dir = @opendir($path); while ($file = @readdir($dir)) { if (!is_dir($path.$file)) { $splitted = explode('.', $file); $ext = strtolower($splitted[count($splitted)-1]); if (in_array($ext, $supported_ext)) $files[] = $file; } } @closedir($dir); sort($files);*/ } public static function getForm($id) { $formFileName = self::$pluginPath . '/forms/' . $id . '.php'; if(file_exists($formFileName) == true) { $contactForm = new JFormer($id, array('submitButtonText' => 'Submit', action => admin_url('admin-ajax.php'))); include($formFileName); return $contactForm->processRequest(); } else { // echo 'warning from jformer-for-wp - ' . $formFileName . ' not found.'; return -1; } } public static function shortcodeHandler($atts, $content) { extract( shortcode_atts( array( 'id' => '0', 'class' => '', 'text' => '' ), $atts ) ); // echo 'dumping shortcode values. content: ' . $content . ', id: ' . $id . ', class: ' . $class . '
'; if( $text == '' ) { return self::getForm($id); /* return the actual form */ } else /* return a link to the form */ { if( $class=='' ) return '' . $text . ''; else return '' . $text . ''; } } public static function setRewriteRules() { // this two lines are to add external page add_rewrite_tag( '%formid%', '([^/]+)'); add_permastruct( 'formid', 'form/%formid%', true ); // this is to rewrite rule and direct to an internal page // add_rewrite_rule( 'forms/?([^/]*)', 'index.php?pagename=forms-page&formid=$matches[1]', 'top' ); } public static function addQueryVars($vars) { $vars[] = 'formid'; return $vars; } public static function formDisplay() { if( $formid = get_query_var( 'formid' ) ) { $formCode = self::getForm($formid); if($formCode != -1) { include ( self::$pluginPath . '/html/redirect-page-header.php' ); echo $formCode; include ( self::$pluginPath . '/html/redirect-page-footer.php' ); exit; } } } public static function activate() { /* When you use the global keyword to define a variable, what you are saying is that you want to be able to access a variable that exists outside of our class. The $wpdb variable in WordPress allows us to easily interact with the database that WordPress is installed on. To learn more about how to use the $wpdb Object visit here: http://codex.wordpress.org/Function_Reference/wpdb_Class */ global $wpdb; setRewriteRules(); flush_rewrite_rules(); } /* This function will run when the user deactivates the plugin from the WordPress Plugin screen. You might want to put some code in here to remove the tables and options that your plugin created, but, if you do that here, and the user reenables your plugin, they will lose all the data and settings they had previously set. Your alternative, is to create an uninstall.php file and place your cleanup code in there. This code is run when the user deletes your plugin. Open uninstall.php to see how this file works. */ public static function deactivate() { flush_rewrite_rules(); } /* load_plugin_textdomain simply tells WordPress the textdomain we set for our translation strings, and tells it where to look for our language files. */ public static function setLanguage() { load_plugin_textdomain( 'JFormerForWP', null, dirname( plugin_basename( __FILE__ ) ) . '/languages/'); } public static function insertAdminMenuLink() { /* Using the add_menu_page and add_submenu_page functions we can add our own pages to the Administration menu. More information about this function can be found here: http://codex.wordpress.org/Adding_Administration_Menus */ /* $page = add_submenu_page( 'options-general.php' , // This is the parent page that we want to add our configuration page to __( 'jFormer Plugin' , 'JFormerForWP' ), // This will be the title of our configuration page __( 'jFormer Plugin' , 'JFormerForWP' ), // This will be the name of the link in the menu 'edit_plugins' , // This is the minimum role that the user must have to be able to see and click on this link. You use this parameter to limit access to only certain WordPress users, ie authors cannot access the page but Administrators can. A complete list of user roles and capabilities can be found here: http://codex.wordpress.org/Roles_and_Capabilities 'JFormerForWP' , // This is a unique string used to identify your configuration page. The URI of this admin page will be options-general.php?page=B2Template. If you have multiple configuration pages, remember that they should all have unique identifiers array( $this , 'ConfigPageHtml' ) // This is the function that will be run to genereate the page when the user clicks on the link. ); */ // Add_submenu_page returns a unique identifier for our page. We can use that identifier in the hooks below so that these functions only run when the user visits our Administration page, and not other pages. This is helpful because we don't want to slow down the users loading time by including stylesheets and javascript across the entire WordPress admin, when it's only being used on our page. //add_action( 'admin_print_scripts-'.$page , array( $this, 'AdminScripts' ) ); //add_action( 'admin_print_styles-'.$page , array( $this, 'AdminStyles' ) ); // WordPress requires us to "register" our plugins settings before we can let the user update them. This is a security feature to prevent unauthorized addition of settings. //add_action( 'admin_init' , array( $this,'RegisterAdminSettings' ) ); } public static function registerAdminSettings() { /* The first parameter is the name of the Settings group that is going to be saved. As you can see I have two separate groups of settings that can be saved independently. The second parameter is the name of the setting you want to save. Notice that I've added the plugin name to the beginning of the setting to avoid a naming conflict in the database.*/ register_setting('JFormerForWPSettings', 'JFormerForWPSettings_option1'); } /* This is the callback function that we defined above to run when the user clicks on the link to get to our plugin's configuration page. You could simple us an echo statement in this function to output all of your html here, but in order to keep things a little cleaner and more organized, I use the following method to retrieve the html from an external file. */ public static function configPageHtml() { $content = ''; ob_start(); // This function begins output buffering, this means that any echo or output that is generated after this function will be captured by php instead of being sent directly to the user. require_once('html/config.php'); // This function includes my configuration page html. Open the file html/config.php to see how to format a configuration page to save options. $content = ob_get_contents(); // This function takes all the html retreived from html/config.php and stores it in the variable $content ob_end_clean(); // This function ends the output buffering echo $content; // Now I simply echo the content out to the user } public static function adminScripts() { } public static function adminStyles() { } /* This filter lets us add or own links to this list. I'm using it to provide users with a shortcut to the Plugin's settings page, but it could be used for anything (eg to insert a donate link, or link to Plugin suppert forums). The function takes an array of links, adds our link to the array and then returns the modified array. */ public static function insertSettingsLink($links) { $settings_link = ''.__('Settings','JFormerForWP').''; array_unshift( $links, $settings_link ); return $links; } /* This function adds JavaScript and CSS to the viewer facing side of WordPress. Scroll up to AdminStyles and AdminScripts() to see how these functions work */ public static function styles() { wp_enqueue_style('jformer', self::$pluginUrl. 'css/style.css'); } public static function scripts() { wp_enqueue_script('jformer', self::$pluginUrl . 'jFormer/jFormer.js',array('jquery')); /*wp_localize_script('JFormerForWP_SubmitForm','JFormerForWP', array( 'AjaxError'=>__('An error occurred. Please try your action again. If the problem persists please contact the plugin developer.','B2Template') ));*/ } } ?>

Solutions Collecting From Web of "Wie kann ich meine Umschreibregeln am Anfang hinzufügen, auf die richtige Seite redirect und die Regeln für die Aktivierung des Plugins löschen?"

Parameter in add_permastruct()

Der dritte Parameter von add_permastruct() ist für den Parameter is_front . Dies ist ein Basisname, den Sie der Standard-Permalink-Struktur all Ihrer Posts im WordPress-Admin hinzufügen können.

Wenn Sie beispielsweise die Permalink-Struktur auf /blog/%postname% das Wort blog Ihrer Regel vorangestellt. In Ihrem Fall sollten Sie dies auf false .

Reihenfolge der Rewrite-Regeln

add_permastruct() fügt die Rewrite-Regel am Ende der Liste hinzu. Daher ist die erste Regel, die WordPress verwendet, diejenige mit dem pagename . Wenn WordPress keine Seite mit dem angegebenen Slug findet, sucht der Filter redirect_canonical nach einem ähnlichen.

Dieses Verhalten kann geändert werden. Entfernen Sie einfach den Filter mit dem folgenden Ausschnitt:

 // Stop WordPress from auto redirecting if page/post was not found remove_filter('template_redirect', 'redirect_canonical'); 

Aber in meiner Meinung, in Ihrem Anwendungsfall sollten Sie den Filter rewrite_rules_array , um Ihre Rewrite-Regeln hinzuzufügen. Dort können Sie das komplette Rewrite-Array selbst modifizieren.

 add_filter('rewrite_rules_array', array(__CLASS__, 'addRewriteRules')); public static function addRewriteRules($rules) { $newRules = array( // Add your rules eg 'search/?$' => 'index.php?pagename=search', ); return $newRules + $rules; // add the rules on top of the array } 

Flushing Rewrite Regeln

Sie können die Rewrite-Regeln für die Plugin-Aktivierung löschen, verwenden Sie einfach die function flush_rewrite_rules() . Wenn Sie der function keinen Parameter übergeben, wird auch die .htaccess Datei neu erstellt. Wenn Sie den Parameter auf ” false , wird nur die Transition der databaseumschreibung aktualisiert.

Aktionen / Filter in classn

Sie müssen den classnnamen nicht jedes Mal schreiben, wenn Sie eine statische Methode aufrufen oder einen Filter oder eine Aktion in einer class verwenden.

Anstatt von:

 echo JPFormerForWP::methodName(); add_action('wp_print_scripts', 'JFormerForWP::scripts'); 

Sie können verwenden:

 self::methodName(); add_action('wp_print_scripts', array(__CLASS__, 'scripts')); 

Dies hat einige Vorteile. Wenn Sie den Namen Ihrer class ändern, müssen Sie nicht jedes Vorkommen von JFormerForWP ersetzen. Dies hilft auch, wenn Sie die Methode in eine andere class verschieben. Sie müssen sich keine Gedanken über die Benennung machen.

Für Aktionen und Filter verwendet WordPress die PHP-function call_user_func hinter den Kulissen, die verschiedene Methoden zum Aufruf von classnmethoden erlaubt.