Intereting Posts
Пустой поиск вводит все сообщения Передать переменную из действия обратно в шаблон Добавить настраиваемое поле в область администрирования без использования метабокса wp_editor теряет данные, возможно, проблему html_entity_decode? Добавить Metabox в страницу настроек / параметров Разработка различных выпусков веб-сайтов на основе стран? Запрос AJAX на интерфейсе всегда возвращает 0, если пользователь не является администратором Есть ли в WordPress Loop функция, подобная циклу Shopify? Почему WP не похож на мой контейнер <a>? Подменю с параметром URL и доступом к странице Где находится все в одном SEO-файле sitemap.xml? Панель администратора WordPress нажала Sticky Footer в нижней части страницы. Петля 3 столбца столбца и продолжайте цикл в те же столбцы Авто сортировать список сообщений wp-admin с помощью мета-ключа Пользовательская таксономия с пользовательскими типами сообщений Нет сообщений

Как добавить мои правила перезаписи в начале, перенаправить на нужную страницу и сбросить правила активации плагина?

Привет, я сейчас пишу плагин WordPress, который хочу опубликовать для публики. Однако у меня есть несколько проблем с переписанием URL.

У меня есть плагин для перенаправления на страницу плагина add_action('template_redirect', 'myfuncdisplay') для отображения пользовательского вывода.

Я также получил работу по перенаправлению, например, www.mydomain.com/index.php?form=contact2 например, вызывает вызов кода template_redirect.

Все идет нормально. Однако, если я mydomain.com/form/contact он действительно перенаправит существующую страницу mydomain.com/products/contact-centres .

Если я mydomain.com/form/contact2 в mydomain.com/form/contact2 он будет перенаправлен на мой плагин.

При проверке на Cool Rewrite Analyzer я получаю следующее:

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

Я играл с кодом и добавил параметр в true … теперь, похоже, он работает и игнорирует тот факт, что у меня есть другие страницы, перечисленные с контактом, теперь он просто переходит прямо к моему плагину:

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

Правильно ли это? Устанавливает ли третий параметр приоритет моей постоянной ссылки? Насколько я могу судить, WordPress попытается сопоставить имя и игнорировать любые / my / other / url / post-name … кажется, это делается на всех сайтах, которые немного запутывают.

Кроме того, чтобы заставить мой плагин работать, мне нужно перейти к параметрам Permalink в меню администратора и нажать «Сохранить» … если я этого не сделаю, как если бы мои правила не были включены. Есть ли способ обойти это, если это не будет сделано при активации плагина или мне нужно сообщить моим пользователям плагина щелкнуть пункт меню Permalinks, чтобы активировать перенаправления плагинов?

Мой код ниже, оцените помощь и время для ваших ответов.

Крис

 <?php require_once('jFormer/jformer.php'); /*interface JFormerForWPFormClass { public function GetForm(); public function ProcessForm(); }*/ class JFormerForWP { static $errors = false; /* for debugging */ const DB_VERSION = 1; // This number represents the current version of the plugins table structure. Increment this every time you modify the scheme of the database tables that you create for your plugin. static $pluginPath; static $pluginUrl; static $registry; static $permastructString = 'form'; /*public static function RegisterForm($form) { $self::registry[$id] = $form(); } */ public static function makeFormFactory($id,$class) { $classPath = self::$pluginPath . "/forms/{$class}.php"; require_once $classPath; /*$this->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 . '<br >'; if( $text == '' ) { return self::getForm($id); /* return the actual form */ } else /* return a link to the form */ { if( $class=='' ) return '<a href="' . home_url() . '/' . $permastructString . '/' . $id . '" title="'. $title .'">' . $text . '</a>'; else return '<a href="' . home_url() . '/' . $permastructString . '/' . $id . '" title="'. $title .'" class="'. $class .'">' . $text . '</a>'; } } 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 = '<a href="options-general.php?page=JFormerForWP">'.__('Settings','JFormerForWP').'</a>'; 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 "Как добавить мои правила перезаписи в начале, перенаправить на нужную страницу и сбросить правила активации плагина?"

Параметр в add_permastruct()

Третий параметр add_permastruct() – для параметра is_front . Это базовое имя, которое вы можете добавить к структуре по умолчанию для всех ваших сообщений в администраторе WordPress.

Например, если вы установили структуру permalink в /blog/%postname% слово blog будет добавлено к вашему правилу. В вашем случае вы должны установить значение false .

Заказ правил перезаписи

add_permastruct() добавляет правило перезаписи в конце списка. Поэтому первое совпадение с правилом WordPress – это имя с pagename . Если WordPress не сможет найти страницу с данным slug, фильтр redirect_canonical будет искать подобный.

Такое поведение можно изменить. Просто удалите фильтр со следующим фрагментом:

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

Но в моем предложении, в вашем usecase вы должны использовать фильтр rewrite_rules_array чтобы добавить свои правила перезаписи. Там вы можете изменить полный массив перезаписи самостоятельно.

 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 } 

Правила перезаписи

Вы можете сбросить правила перезаписи при подключении плагинов, просто используйте функцию flush_rewrite_rules() . Если вы не передадите параметр функции, файл .htaccess также будет воссоздан. Если вы установите для параметра значение false , будет обновляться только переписывание базы данных.

Действия / Фильтры в классах

Вам не нужно писать имя класса каждый раз, когда вы вызываете статический метод или используете фильтр или действие внутри класса.

Вместо:

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

Вы можете использовать:

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

Это имеет некоторые преимущества. Если вы измените имя своего класса, вам не нужно заменять каждое событие JFormerForWP . Это также поможет, если вы переместите метод в другой класс. Вам не нужно беспокоиться об именовании.

Для действий и фильтров WordPress использует функцию php call_user_func за кулисами, которая позволяет использовать разные способы вызова методов класса.