Использование WP Rewrite для перезаписи пользовательских URL в этом сценарии

Я создал плагин, где я могу выводить специальные страницы php на странице с помощью короткого кода.

Каталог плагинов состоит из следующих страниц php.

product_info.php index.php account.php login.php checkout.php core.php 

Функция shortcode, которая находится на core.php выглядит следующим образом:

 function output_store(){ if(!isset($_REQUEST['slug'])) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/index.php'); if($_REQUEST['slug']) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/'.$_REQUEST['slug']); } function filter($content = '') { if ( '' == $content || !strstr($content, '[WP_online_store]') ) { return $content; } return preg_replace('|(<p>)?(\n)*[(\[)WP_online_store(\])](\n)*(</p>)?|', do_shortcode( '[WP_online_store]' ), $content); } add_shortcode('output_store', 'output_store'); add_filter('the_content', 'filter'); в function output_store(){ if(!isset($_REQUEST['slug'])) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/index.php'); if($_REQUEST['slug']) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/'.$_REQUEST['slug']); } function filter($content = '') { if ( '' == $content || !strstr($content, '[WP_online_store]') ) { return $content; } return preg_replace('|(<p>)?(\n)*[(\[)WP_online_store(\])](\n)*(</p>)?|', do_shortcode( '[WP_online_store]' ), $content); } add_shortcode('output_store', 'output_store'); add_filter('the_content', 'filter'); в function output_store(){ if(!isset($_REQUEST['slug'])) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/index.php'); if($_REQUEST['slug']) include(WP_PLUGIN_DIR.'/'.basename(dirname(__FILE__)).'/'.$_REQUEST['slug']); } function filter($content = '') { if ( '' == $content || !strstr($content, '[WP_online_store]') ) { return $content; } return preg_replace('|(<p>)?(\n)*[(\[)WP_online_store(\])](\n)*(</p>)?|', do_shortcode( '[WP_online_store]' ), $content); } add_shortcode('output_store', 'output_store'); add_filter('the_content', 'filter'); 

[output_store] будет размещаться на любой странице, например, на странице store поэтому, когда я посещаю страницу store содержимое по умолчанию на этой странице отобразит файл index.php из каталога плагина.

В файле index.php меня есть ссылки для доступа к login.php, product_info.php, account.php and checkout.php каждого есть URL-адрес:

 login.php => http://website.com/store/?slug=login.php product_info.php => http://website.com/store/?slug=product.info.php account.php => http://website.com/store/?slug=account.php checkout.php => http://website.com/store/?slug=checkout.php 

Также на index.php меня есть продукты, которые вытащили из базы данных mysql, в которой доступны такие ссылки, как http://website.com/store/?slug=product_info.php&products_id=38 и т. Д.

Теперь я хотел переписать эти URL-адреса для дружественной поисковой системы. Я хотел:

 http://website.com/store/?slug=login.php to become http://website.com/store/login http://website.com/store/?slug=account.php to become http://website.com/store/account http://website.com/store/?slug=checkout.php to become http://website.com/store/checkout 

и все URL-адреса продукта:

  like http://website.com/store/?slug=product_info.php&products_id=38 to become http://website.com/store/product-info/38 

Как я могу это сделать, используя WPRewite WordPress?

Я попробовал это для информационных страниц продукта:

 // Define permalinks function add_query_vars($aVars) { $aVars[] = "products_id"; return $aVars; } function add_rewrite_rules($aRules) { $aNewRules = array('product-info/([^/]+)/?$' => 'index.php?slug=product_info.php&products_id=$matches[1]'); $aRules = $aNewRules + $aRules; return $aRules; } add_filter('query_vars', 'add_query_vars'); add_filter('rewrite_rules_array', 'add_rewrite_rules'); function isset_productinfo() { if(isset($wp_query->query_vars['products_id'])) { $sMsdsCat = urldecode($wp_query->query_vars['products_id']); } } add_action('init','isset_productinfo'); // End Special Permalinks 

Сбросил мои постоянные ссылки и не работал. Когда я перехожу на http://website.com/store/product-info/38 и перехожу на http://website.com/store/ вместо отображения страницы продукта. Как я могу это исправить? или у вас есть другие решения?

Пожалуйста помоги..

В вашем случае будет что-то вроде:

 add_action('rewrite_rules_array', 'rewrite_rules'); function rewrite_rules($rules) { $new_rules = array( 'product/([0-9]+)/?$' => 'index.php?product=$matches[1]' ); return $rules + $new_rules; } add_action('query_vars', 'add_query_vars'); function add_query_vars($vars) { array_push($vars, 'product'); return $vars; } add_action('template_redirect', 'custom_template_redirect'); function custom_template_redirect() { global $wp_query, $post; if (get_query_var('product')) { include(YOURPLUGINDIR . 'templates/product_template.php'); exit(); } } 

В product_template.php вы можете получить доступ к тому, какой продукт был запрошен с помощью get_query_var('product') .

После изменения массива правил вам необходимо сбросить правила. Сделайте это, просто http://yoursite/wp-admin/options-permalink.php на страницу администрирования permalink по http://yoursite/wp-admin/options-permalink.php .

Кроме того, вы можете увидеть порядок тестирования правил и с которым сопоставляется:

 add_action('wp', 'debug_rules'); function debug_rules() { global $wp, $wp_query, $wp_rewrite; echo $wp->matched_rule . ' | ' . $wp_rewrite->rules[$wp->matched_rule]; print_r($wp_rewrite->rules); exit(); } 

И попробуйте, чтобы ваш плагин работал для обоих случаев (переменные GET и пользовательские правила перезаписи), поскольку вы никогда не знаете, смогут ли ваши пользователи запускать постоянные ссылки.

Итак, как говорят нам документы :

 if ( get_option('permalink_structure') ) { /* do everything as above */ } else { /* so stuff only with GET variables } 

Я думаю, что проблема в этом случае является несоответствием в имени запроса arg:

В вашем требовании у вас есть:

 http://website.com/store/?slug=product_info.php&product_id=38 

В вашей реализации у вас есть:

 $aNewRules = array('product-info/([^/]+)/?$' => 'index.php?slug=product_info.php&products_id=$matches[1]'); 

Теперь, если код в product_info.php ожидает product_id то product_id не будет работать.