Переопределить маршрутизацию WordPress / перезапись URL?

#wordpress #custom-wordpress-pages

#wordpress #пользовательские-wordpress-страницы

Вопрос:

Я хотел бы обслуживать другой контент на основе URL. Я начал с настройки пользовательской страницы с помощью пользовательского шаблона, но я открыт для чего-то другого.

Основная цель — создать одну страницу PHP, которая может программно обслуживать различное содержимое на основе URL.

Например:

 https://some-url.com/my-plugin/ -> run my page
https://some-url.com/my-plugin/foo/ -> run my page
https://some-url.com/my-plugin/foo2/abc/ -> run my page
etc...
  

Я просматривал add_rewrite_rule , add_rewrite_tag , flush_rewrite_rules и WP_Rewrite API , но я запутался в том, какой из них мне следует использовать?

Я нашел пример здесь, но я не смог заставить его работать, я получаю 404s, есть идеи, почему?:

  /*
   Plugin Name: Products Plugin
   Plugin URI: http://clivern.com/
   Description: Register URL rules for our products
   Version: 1.0
   Author: Clivern
   Author URI: http://clivern.com
   License: MIT
  */
 function products_plugin_activate() {
  products_plugin_rules();
  flush_rewrite_rules();
 }

 function products_plugin_deactivate() {
  flush_rewrite_rules();
 }

 function products_plugin_rules() {
  add_rewrite_rule('products/?([^/]*)', 'index.php?pagename=productsamp;product_id=$matches[1]', 'top');
 }

 function products_plugin_query_vars($vars) {
  $vars[] = 'product_id';
  return $vars;
 }

 function products_plugin_display() {
  $products_page = get_query_var('pagename');
  $product_id = get_query_var('product_id');
  if ('products' == $products_page amp;amp; '' == $product_id):
   //show all products
   exit;
  elseif ('products' == $products_page amp;amp; '' != $product_id):
   //show product page
   exit;
  endif;
 }

 //register activation function
 register_activation_hook(__FILE__, 'products_plugin_activate');
 //register deactivation function
 register_deactivation_hook(__FILE__, 'products_plugin_deactivate');
 //add rewrite rules in case another plugin flushes rules
 add_action('init', 'products_plugin_rules');
 //add plugin query vars (product_id) to wordpress
 add_filter('query_vars', 'products_plugin_query_vars');
 //register plugin custom pages display
 add_filter('template_redirect', 'products_plugin_display');
  

Комментарии:

1. Реальный вопрос в том, ПОЧЕМУ вы хотите это сделать? Это было бы ужасно для SEO.

2. Потому что моя пользовательская страница PHP содержит всю логику кода и основана на URL-адресах, и это шаг вперед, чтобы заставить ее работать сейчас.

3. Просто для ясности: у вас есть пользовательская страница шаблона PHP, которая имеет логику и в зависимости от URL-адреса обслуживает различный контент?

4. да, в значительной степени.

5. Я добавил пример, но не смог заставить его работать, не уверен, почему, есть идеи?

Ответ №1:

Прежде всего, убедитесь, что ваши постоянные ссылки pretty включены, в этом случае параметр «Обычный» в настройках — Постоянные ссылки должен быть отменен: Выберите один из этих параметров, чтобы включить постоянные ссылки pretty

Вы можете проверить, включены ли в коде постоянные ссылки, например:

 function is_enabled_pretty_permalinks() {
    return !empty( get_option( 'permalink_structure' ) );
}

if ( is_enabled_pretty_permalinks() ) {
    echo 'Pretty permalinks enabled';
}
  

Затем добавьте новое правило перезаписи:

 function add_my_rewrite_rule() {
   $page_slug = 'products'; // slug of the page you want to be shown to
   $param     = 'do';       // param name you want to handle on the page

   add_rewrite_rule('my-plugin/?([^/]*)', 'index.php?pagename=' . $page_slug . 'amp;' . $param . '=$matches[1]', 'top');
}
add_action('init', 'add_my_rewrite_rule');
  

Добавьте свой параметр в переменные запроса, чтобы вы могли обрабатывать его на странице:

 function add_my_query_vars($vars) {
    $vars[] = 'do'; // param name you want to handle on the page
    return $vars;
}
add_filter('query_vars', 'add_my_query_vars');
  

Затем вы можете получить доступ к своему варианту запроса do в шаблоне страницы или в коротком коде, например:

 function my_plugin_shortcode_handler( $atts ){
  $do = get_query_var( 'do' );
  if ( $do === 'this' ) {
     return 'do this';
  } else {
     return 'do that';
  }
}
add_shortcode( 'myshortcode', 'my_plugin_shortcode_handler' );
  

Затем поместите короткий код в содержимое через Gutenberg.

Проверьте ссылки:

 https://some-url.com/my-plugin/this/ - outputs "do this"
https://some-url.com/my-plugin/that/ - outputs "do that".
  

Комментарии:

1. тогда какой короткий код размещен на странице, на которой есть slug ‘my-new-page’? мы никогда не сможем получить доступ к get_query_var( ‘do’)

2. @hekag71341, просто добавьте другое правило перезаписи для ‘my-new-page’, в примере замените ‘products’ на ‘my-new-page’.

Ответ №2:

Это можно решить с помощью параметров запроса. Как вы упомянули, вы настроили пользовательскую страницу с помощью пользовательского шаблона. Вы можете прочитать URL и проверить параметры, и на основе этого вы можете отправлять данные со страницы шаблона PHP.

например,

  function cleanTheInput($data) {
     $data = trim($data);
     $data = stripslashes($data);
     $data = htmlspecialchars($data);
     $data = htmlentities($data);
     return $data;
 }

 if (isset($_GET['page_url'])) {
    $theUrl = cleanTheInput($_GET['page_url']);
 }

 if($theUrl == 266)){
  // data for https://some-url.com/?page_url=266
 }
  if($theUrl == 366)){
  // data for https://some-url.com/?page_url=366
 }