根据当前URL显示内容

时间:2021-06-06 作者:terminator

我想创建基于外部API的大多数网站结构

制造商->;品牌

下面是API的输出

array(2) {
  [0]=>
      object(stdClass)#448 (6) {
        ["id"]=>
        string(2) "17"
        ["full_name"]=>
        string(11) "manufacture 1"
        ["label"]=>
        string(8) "manufacture 1"
        ["Description"]=>
        string[25]  "Description manufacture 1"
        ["url"]=> 
        string(15) "/manufacture-1/"
        ["brands"]=>
        array(2) {
          [0]=>
          object(stdClass)#442 (27) {
            ["id"]=>
            string(3) "151"
            ["full_name"]=>
            string(34) "brand 1"
            ["label"]=>
            string(19) "brand 1"
            ["Description"]=>
            string[25]  "Description Brand 1"
            ["url"]=> 
            string(23) "/manufacture-1/brand-1/"
            }
          [1]=>
          object(stdClass)#142 (27) {
            ["id"]=>
            string(3) "152"
            ["full_name"]=>
            string(34) "brand 2"
            ["label"]=>
            string(19) "brand 2"
            ["Description"]=>
            string[25]  "Description Brand 2"
            ["url"]=> 
            string(23) "/manufacture-1/brand-2/"
          }
        }
      }
  [1]=>
      object(stdClass)#2448 (6) {
        ["id"]=>
        string(2) "19"
        ["full_name"]=>
        string(11) "manufacture 2"
        ["label"]=>
        string(8) "manufacture 2"
        ["Description"]=>
        string[25]  "Description manufacture 2"
        ["url"]=> 
        string(15) "/manufacture-2/"
        ["brands"]=>
        array(2) {
          [0]=>
          object(stdClass)#2442 (27) {
            ["id"]=>
            string(3) "351"
            ["full_name"]=>
            string(34) "brand 3"
            ["label"]=>
            string(19) "brand 3"
            ["Description"]=>
            string[25]  "Description Brand 3"
            ["url"]=> 
            string(23) "/manufacture-2/brand-3/"
            }
          [1]=>
          object(stdClass)#3442 (27) {
            ["id"]=>
            string(3) "352"
            ["full_name"]=>
            string(34) "brand 4"
            ["label"]=>
            string(19) "brand 4"
            ["Description"]=>
            string[25]  "Description Brand 4"
            ["url"]=> 
            string(23) "/manufacture-2/brand-4/"
          }
        }
      }
}
因此,基于上述api,我想创建链接并根据以下内容显示数据:

在主页上,我将显示2个制造商

如果用户单击制造商1

他转到https页:/example。com/制造商-1

然后显示两个品牌-品牌1和品牌2以及制造商1的描述

如果我点击品牌1,他会转到页面https:/example。com/制造商-1/品牌-1

然后我们按顺序显示数据

那么,如果我在https:/example页上,我该如何做这个I.eIf。com/manufacture-1/brand-1,我检测什么是url并相应地显示内容

请给我指出正确的方向,如何继续

EDIT ->

根据您的回答,@Jos Faber I添加了代码,但进行了一些编辑,以适应第三方var(制造商->;品牌->;型号)

以下是代码

add_filter( \'rewrite_rules_array\',\'jf_insert_rewrite_rules\' );
function jf_insert_rewrite_rules( $rules ) {
  $newrules[\'^production(.*)/(.*)/(.*)/?$\'] = \'index.php?manufacturer=$matches[1]&brand=$matches[2]&model=$matches[3]\';
  return $newrules + $rules;
}

add_filter(\'query_vars\', \'jf_add_query_vars\');
function jf_add_query_vars( $vars ) {
    $vars[] = \'manufacturer\'; 
    $vars[] = \'brand\';
    $vars[] = \'model\'; 
    return $vars;
} 

add_action(\'template_redirect\', \'jf_manufacturer_brand_templates\');
function jf_manufacturer_brand_templates() {
  if (get_query_var(\'manufacturer\') || get_query_var(\'brand\') || get_query_var(\'model\')) {  
    if (file_exists(get_template_directory() . \'/manu_brand.php\')) {
      add_filter( \'template_include\', function() {
        return get_template_directory() . \'/manu_brand.php\';
      });
    }
  }
}
manu\\u品牌代码。php是

echo "Manufacturer=".get_query_var(\'manufacturer\').\'<br>\';
echo "brand=". get_query_var(\'brand\').\'<br>\';
echo "model=". get_query_var(\'model\').\'<br>\';

var_dump(
    get_query_var(\'manufacturer\'), 
    get_query_var(\'brand\'),
    get_query_var(\'model\')
);
  1. https://www.servers-hosting.com/production/manufacture-1/brand-1/model-1/ ---- 完美的作品

  2. https://www.servers-hosting.com/production/manufacture-1/brand-1/ --- 请参见第页it为错误的查询变量返回错误的值

  3. https://www.servers-hosting.com/production/manufacture-1/ ---- 404错误

同样,对于模板重定向,我将更改为| |,而不是&&;

你能帮我解决这个问题吗

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

要使其工作,您必须添加一个重写https://example.com/[manufacturer slug]/[brand slug] 索引。php,例如。manufacturer=[manufacturer slug]&brand=[brand slug].e、 g.:

add_filter( \'rewrite_rules_array\',\'jf_insert_rewrite_rules\' );
function jf_insert_rewrite_rules( $rules ) {
  $newrules[\'^(.*)/(.*)/?$\'] = \'index.php?manufacturer=$matches[1]&brand=$matches[2]\';
  return $newrules + $rules;
}
记住转到permalinks页面并点击save以更新重写规则。

Mind you! 这样,就不可能再在一个页面(例如/关于/联系)下有一个1级子页面,因为这将被替换为/[制造商slug]/[品牌slug]重写。最好在其前面加一个标记,例如/production/manufacturer-1/brand-1,再加上这样的重写规则:^production/(.*)/(.*)/?$

除此之外,您还需要注册查询变量,例如:

add_filter(\'query_vars\', \'jf_add_query_vars\');
function jf_add_query_vars( $vars ) {
    $vars[] = \'manufacturer\'; 
    $vars[] = \'brand\'; 
    return $vars;
} 
您可能希望此页面具有自己的模板,以便可以从外部api中提取。可以通过检查manufacturerbrand 参数:

add_action(\'template_redirect\', \'jf_manufacturer_brand_templates\');
function jf_manufacturer_brand_templates() {
  if (get_query_var(\'manufacturer\') && get_query_var(\'brand\')) {  
    if (file_exists(get_template_directory() . \'/manu_brand.php\')) {
      add_filter( \'template_include\', function() {
        return get_template_directory() . \'/manu_brand.php\';
      });
    }
  }
}
您也可以在这里有多个案例,因为如果只有制造商可用,则可以显示每个制造商的品牌。甚至只是品牌,以展示品牌细节。

在该模板中,可以获取如下参数:

var_dump(
    get_query_var(\'manufacturer\'), 
    get_query_var(\'brand\')
);

// hit API with these params and show the result


UPDATE

您的重写规则有错误^production(.*)/ 不会正确匹配,因为我的目的是使用production/....

最简单的方法是再添加两条重写规则。它可以在一个重写规则中完成,但要了解这些规则,最好是编写三个规则,请参见下面的代码。

我还更新了处理模板选择的函数,以便您可以查看如何选择正确的模板。这也可以在一个模板中完成,但最好有单独的模板和规则。

如果这对您有帮助,请告诉我(记住转到permalinks页面并点击save以更新重写规则;-)。

add_filter(\'query_vars\', \'jf_add_query_vars\');
function jf_add_query_vars( $vars ) {
    $vars[] = \'manufacturer\'; 
    $vars[] = \'brand\'; 
    $vars[] = \'model\'; 
    return $vars;
} 

add_action(\'template_redirect\', \'jf_manufacturer_brand_templates\');
function jf_manufacturer_brand_templates() {
  $manufacturer = get_query_var(\'manufacturer\');
  $brand = get_query_var(\'brand\');
  $model = get_query_var(\'model\');
  if ( ! empty($manufacturer) && ! empty($brand) && ! empty($model) ) {  
    if (file_exists(get_template_directory() . \'/model-detail.php\')) {
      add_filter( \'template_include\', function() { return get_template_directory() . \'/model-detail.php\'; });
    }
  } else if ( ! empty($manufacturer) && ! empty($brand) ) {
    if (file_exists(get_template_directory() . \'/brand-detail.php\')) {
      add_filter( \'template_include\', function() { return get_template_directory() . \'/brand-detail.php\'; });
    }
  } else if ( ! empty($manufacturer) ) {
    if (file_exists(get_template_directory() . \'/manufacturer-detail.php\')) {
      add_filter( \'template_include\', function() { return get_template_directory() . \'/manufacturer-detail.php\'; });
    }
  }
}

function jf_insert_rewrite_rules( $rules ) {
  $newrules[\'^production/(.*)/(.*)/(.*)/?$\'] = \'index.php?manufacturer=$matches[1]&brand=$matches[2]&model=$matches[3]\';
  $newrules[\'^production/(.*)/(.*)/?$\'] = \'index.php?manufacturer=$matches[1]&brand=$matches[2]\';
  $newrules[\'^production/(.*)/?$\'] = \'index.php?manufacturer=$matches[1]\';
  return $newrules + $rules;
}
add_filter( \'rewrite_rules_array\',\'jf_insert_rewrite_rules\' );
您可以在此处看到工作示例的输出:https://jos.studioparkers.nl/wpplay/production/manufacturer-1/brand-1/model-1https://jos.studioparkers.nl/wpplay/production/manufacturer-1/brand-1https://jos.studioparkers.nl/wpplay/production/manufacturer-1

相关推荐

WP API响应未显示我注册的元数据

我正在尝试从自定义帖子类型获取元数据splash_location 然而,这并没有出现在我的回答中。我已注册metatagsplash_location_title 但它没有显示在我的JSON请求中。function splash_location_custom_post_type() { register_post_type(\'splash_location\', array( \'labels\' => array(