将规则重写为自定义模板

时间:2020-04-18 作者:Adam Kit

目前,我有以下几点:

自定义模板:my\\u custom\\u template。php,其中调用下面的函数。

<?php $uni_data = get_uni_data() ?>
网页:www.website。使用自定义模板的com/my\\u页面

函数中的函数。php:

function get_uni_data() {
   $segments = explode(\'/\', trim(parse_url($_SERVER[\'REQUEST_URI\'], PHP_URL_PATH), \'/\'));

   $uni_data = [];

    // for www.example.com/user/account you will get \'user\'
   global $wpdb;
   $uni_data = $wpdb->get_row("SELECT * FROM university_table WHERE name LIKE \'Clemson\'", ARRAY_A );


   return $uni_data;
我想在url解析的结尾是什么之后更改查询语句值,即当有人访问www.website时。com/university/Clemson或www.website。com/大学/杜克

查询值为Clemson或Duke。

所以,我想添加一个规则,无论用户何时访问url:www.website。com/大学/名称

使用名称为查询值的get\\u uni\\u数据调用并填写模板。

我是否需要像上面的my\\u page这样的页面来处理此问题?或者我可以直接使用模板吗?重写规则只针对模板,而不考虑特定的页面,会是什么样子?

EDIT 1

我添加了以下功能(根据similar question) 但该页面不存在。

add_action(\'init\', function() {
    $url_path = trim(parse_url(add_query_arg(array()), PHP_URL_PATH), \'/\');
    $templatename = \'university\';
    $pos = strpos($url_path, $templatename);

    if ( $pos != false) {
        $load = locate_template(\'my_custom_template.php\', true);
        return $load;
    }

}) ;

EDIT 2

我现在就试试这个question 在重写规则如下所示的位置回答:

add_rewrite_rule(
        \'university/([^/]+)/?$\',
        \'index.php?pagename=university&uniname=$matches[1],
        \'top\'
    );
查询栏是:

    $query_vars[] = \'uniname\';
并将get\\u uni\\u data函数更改为具有一个参数(uniname),该参数将放在LIKE语句之后。

但我真的不明白add\\u action或add\\u filter是如何工作的,所以我不确定这些是否会工作。

EDIT 3

因此,我在函数中实现了以下内容。php文件:

add_action(\'init\', \'wp_university_full_rewrite\');
function wp_university_full_rewrite() {
    add_rewrite_rule(
        \'university/[^/]*)/?$\',
        \'index.php?pagename=university&uni_name=$matches[1]\',
        \'top\');
}
add_filter(\'query_vars\', \'wp_university_full_query_vars\');
function wp_university_full_query_vars( $query_vars ) {
    $query_vars[] = \'uni_name\';
    return $query_vars  ;
}
function get_uni_data_with_query( $uni_name_query ) {

    $uni_data = [];

    global $wpdb;
    $uni_data = $wpdb->get_row("SELECT * FROM university_table WHERE name LIKE ".$uni_name_query, ARRAY_A );


    return $uni_data;

}
在我的模板中,我添加了:

<?php $uni_name_pull = get_query_var(\'uni_name\') ?>
<?php $uni_data = get_uni_data_with_query($uni_name_pull) ?>
但现在我得到以下错误:

Warning: preg_match(): Compilation failed: unmatched parentheses at offset 17 in /home4/ratemyp9/public_html/wp-includes/class-wp.php on line 224

1 个回复
最合适的回答,由SO网友:Adam Kit 整理而成

找到解决方案:

功能。php:

add_action(\'init\', \'wp_university_full_rewrite\');
function wp_university_full_rewrite() {
    add_rewrite_rule(
        \'university/([^/]*)/?$\',
        \'index.php?pagename=university&uni_name=$matches[1]\',
        \'top\');
}
add_filter(\'query_vars\', \'wp_university_full_query_vars\');
function wp_university_full_query_vars( $query_vars ) {
    $query_vars[] = \'uni_name\';
    return $query_vars  ;
}

function get_data_with_query( $name_query ) {

    $data = [];

    global $wpdb;
    $data = $wpdb->get_row("SELECT * FROM table WHERE name = \'".$name_query."\'", ARRAY_A );


    return $data;

}
自定义\\u模板。php:

<?php $name_pull = get_query_var(\'uni_name\') ?>
<?php $uni_data2 = get_data_with_query($name_pull) ?>

还有一个带有slug“university”的页面,其模板为my\\u custom\\u模板。

我知道这是一种非常粗糙的做事方式,所以现在是时候将所有内容都封装在if语句和错误页中了!!

相关推荐

Updating modified templates

我想调整一些。php模板文件在我的WordPress主题中,我知道正确的过程是将相关文件复制到子主题文件夹中并在那里编辑文件,这样我的修改就不会在将来的主题更新中丢失。但这是否意味着我将无法从主题更新中获益,因为我将文件放在了我的子主题文件夹中?这可能不是一件好事,因为主题更新可能添加了一些有用的特性,甚至修复了我最初需要对代码进行调整的问题!这方面的常见解决方案是什么?有人推荐了一款Diff应用程序——这是人们常用的吗?