#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
}