簡體   English   中英

在沒有404或“找不到頁面”的情況下將任意URL映射到WordPress中

[英]Map arbitrary URL to in WordPress without 404 or “Page Not Found”

假設我的博客住在這里...

/blog/

假設我有無限多個任意網址...

/blog/browse/furniture/
/blog/browse/decor/
/blog/browse/bed/

我希望主題包裝程序為與/ browse / URL模式匹配的任何頁面加載browser.php模板。

我能夠做到這一點,但是,盡管模板內容加載得很好,但WordPress將頁面視為后台的404頁面。 因此頁面標題為“找不到頁面”,並且內置函數(例如“ is_404()”)返回true。 有沒有辦法映射這些動態頁面並使WordPress認為它們是有效的?

這是我想出的代碼...

add_filter('template_include', function($template) {
  global $wp_query;
  if ($wp_query->query['category_name'] === 'browse') {
    $template = locate_template(array('browse.php'));
  }
  return $template;
}, 99);

順便說一句,該方法有效,因為我的永久鏈接結構設置為/%category%/%postname%/ -因此,當前,WordPress將這些/ browse /頁面視為一個類別,因此,我可以對照“ category_name” ”對象。

您能提供的任何幫助將不勝感激。

這里的問題是您只過濾了應該顯示的模板-因此Wordpress發送404,並且您只是告訴他針對這種特殊情況為404頁面顯示其他模板。

您需要做的是在admin中創建一個頁面並將其與您的模板相關聯-如果您不使用其內容或標題都沒有關系。 您只需要在模板上附加帖子/頁面即可制定有效的重寫規則。

您可以在激活時使用以下內容從插件創建該頁面(它將存儲頁面ID作為選項):

function register_activation_hook() {
    if(get_option('browse_page_id') !== false) {
        $page_id = wp_insert_post(array(
            'post_title' => __('Your page title', 'plugin-domain'),
            'post_content' => '',
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_author' => 1,
        ));
        if($page_id && ! is_wp_error($page_id)) {
            update_post_meta($page_id, '_wp_page_template', 'browse.php');
            update_option('browse_page_id', $page_id, true);
        }
    }
}
register_activation_hook(__FILE__, 'register_activation_hook');

您必須在插件文件中使用它,然后停用/重新激活插件才能觸發它。

要使模板被Wordpress識別,請在模板頂部添加以下內容:

<?php
/**
 * Template Name: Browse
 */
?>

然后,在您的functions.php中 ,添加以下內容以定義一個新的重寫標簽來處理您的類別:

function custom_rewrite_tag() {
  add_rewrite_tag('%browse_category%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);

最后,添加一個重寫規則,該規則將使用先前創建的頁面ID和重寫標簽:

function custom_rewrite_rule() {
    if(get_option('browse_page_id') !== false) {
        add_rewrite_rule('^browse/([^/]*)/?','index.php?page_id='.get_option('browse_page_id').'&browse_category=$matches[1]','top');
    }
}
add_action('init', 'custom_rewrite_rule', 10, 0);

要訪問模板中的category參數,請使用以下命令:

$wp_query->query_vars['browse_category']

暫無
暫無

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

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