簡體   English   中英

如何在 Wordpress 中動態使用頁面模板文件?

[英]How can I in Wordpress use page template file dynamically?

是否可以在 Wordpress 中有一個模板頁面,可以動態用於不同的頁面?

例如,我有一個頁面模板cars.php ,我想將它用於不同類型汽車的子頁面,例如:豪華轎車、雙門轎車、SUV、面包車。

我想要這種頁面層次結構:

cars ─┬─limousine
      │
      ├─coupe
      │
      ├─suv
      │
      └─van
 

有這個鏈接:

example.com/cars/limousine/
example.com/cars/coupe/
example.com/cars/suv/
example.com/cars/van/

這些類型的汽車來自一個數據庫,我們可以在其中添加新類型的汽車,比如蜘蛛。

我知道如何手動執行此操作,即使用 Wordpress 編輯器創建頁面 limousine、coupe、suv、van 和 spider,我會選擇 car.php 作為模板。

因此,在我的 cars.php 頁面模板中,如果用戶單擊example.com/cars/limousine/鏈接,我將獲得例如豪華轎車類型的數據。 我應該如何使用我的cars.php頁面模板,以便我可以獲得具有指定層次結構的頁面? 如果我沒有明確創建每個頁面(豪華轎車、轎跑車、SUV、貨車和蜘蛛),Wordpress 將如何識別鏈接,如何將有關特定頁面的信息傳遞給cars.php

此致,

伊戈爾

已編輯的帖子

我已經刪除了我原來的回復,因為它妨礙了我。

The way that WordPress (and many/most modern CMSs) work, is that they tell the server such as Apache, Nginx or IIS to do their normal stuff, but if the server results in an effective 404, pass that result into the CMS at用於進一步處理的已知點(index.php)。

服務器級別

您可以使用的第一個位置是在服務器級別,使用 .htaccess 文件之類的文件。 你可以有一個規則,將/cars/*映射到/cars/?car_type=*上。 不重定向,只是 map。 map 應該在服務器級別產生有效的 404,這意味着 WordPress 使用已知的 URL 和它可以忽略的查詢字符串啟動。 (我有 95% 的把握這會起作用,但我現在沒有可用於測試的 Apache 服務器。)您可以注冊查詢參數,或者您可以只使用$_GET並執行邏輯。

但我不是編輯服務器配置文件的忠實擁護者,特別是如果這需要更加動態,或者由習慣這樣做的人管理。

WordPress級

所以下一站是在 WordPress 中以某種方式處理事情。 壞消息是,無論您做什么,WordPress 都會將其視為 404。但好消息是,您可以根據需要重新路由 404。

我將繼續使用/cars/limo路徑,但您可以根據需要進行調整。

前兩個步驟是可選的,但更接近於“官方”的做事方式,我鼓勵你這樣做,但我稍后會解釋如何跳過它們。

首先,我們需要用我們感興趣的 WordPress 注冊一個模式。第一個參數是一個正則表達式,第二個是一個映射,最后一個說我們基本上想要勝過其他規則。 添加此代碼或對其進行任何更改后,您需要刷新 WordPress 永久鏈接。 此外,如果您在本地開發並且根本沒有啟用重寫,則需要打開它們。

add_action(
    'init',
    static function () {
        add_rewrite_rule('cars/(.+)[/]?$', 'index.php?car_type=$matches[1]', 'top');
    }
);

然而,前面的事情並沒有做很多事情,所以我們還需要告訴 WordPress 我們對某些查詢字符串感興趣。 這個查詢字符串在前面和后面的函數之間應該是相同的。

add_filter(
    'query_vars',
    static function ($query_vars) {
        $query_vars[] = 'car_type';
        return $query_vars;
    }
);

最后一步是使用神奇的template_include過濾器和get_query_var 每個非管理頁面上都會調用此過濾器,因此請小心使用它,並確保僅在保證處於特定場景中時才更改返回。 get_query_var能夠提取我們在第二步中注冊的查詢字符串。

add_filter(
    'template_include',
    static function ($template) {
        $car_type = get_query_var('car_type');
        if ($car_type) {
            // The path must be absolute
            return __DIR__ . '/cars.php';
        }

        return $template;
    }
);

對於if邏輯,您可能需要執行其他操作,例如檢查數組以查看它是否在已知類型的集合中。 如果可能的話,您真的應該避免在此處進行數據庫調用,因為請記住,這是在每個頁面上調用的。

跳過前兩個步驟

如果確實說過您可以跳過前兩個步驟,盡管我不推薦它,但我想向您展示如何做到這一點。 我們仍將使用template_include鈎子,但現在我們將手動查看 URL 並對其進行處理。 這不能保證在不同的服務器環境中存活,並且您可能會遇到一些時髦的場景,所以我說跳過它。 我也不打算包含用於計算頁面本身的邏輯,這也應該很容易。

add_filter(
    'template_include',
    static function ($template) {
        $url = wp_parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
        if( YOUR LOGIC FOR PARSING URL HERE ){
            return 'cars.php';
        }

        return $template;
    }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM