1

我的 web 服务器上的 /blog/ 目录中安装了 wordpress,因此 Wordpress 主页位于,例如http://www.example.com/blog/

我正在为内容管理创建一些自定义帖子类型。我希望“产品”自定义类型的 URL 为http://www.example.com/product/ ...,而“人”自定义类型的 URL 为http://www.example.com/people / ...

现在服务器端这很简单。问题是让 Wordpress 生成(重写)永久链接,因此它们位于 Wordpress 安装/根目录(/home/site/public_html/blog -> http://www.example.com/blog/)下方。

如果使用 PHP 输出缓冲区来搜索-n-replace,我可以这样做,以便将字符串“ http://www.example.com/blog/product ”替换为“ http://www.example.com/product ” ,但这很混乱,会占用更多的内存。如果有官方或正确的非hacky方式来做到这一点,我宁愿这样做。

有谁知道如何做到这一点?

4

1 回答 1

0

如果 WordPress 同时处理产品和人员的博客和页面,您可能需要重新考虑您的文件夹结构。您仍然可以将大部分 WordPress 保留在原处(/blog/子目录),并将其index.php.htaccess文件移至根目录。请参阅为 WordPress 提供自己的目录:使用预先存在的子目录安装

话虽如此,如果您真的不想移动任何东西,那么您需要一个更复杂的编程解决方案。为此,您需要使用WordPress 重写 API。诀窍是使用它的各种功能(add_rewrite_ruleadd_rewrite_tag等)创建一组 WordPress 可以识别的规则,然后将您自己的.htaccess文件写入您网站的根目录中,位于 WordPress 根文件夹上方。

所以,如果你做了这样的事情……</p>

<?php
// Set up the higher-level (non-WordPress) rewrite rules
// so that you redirect non-WP requests to your own WP install.
function make_my_redirects () {
    global $wp_rewrite;
    add_rewrite_rule('^product/', '/blog/index.php?post_type=product', 'top');
    add_rewrite_rule('^people/', '/blog/index.php?post_type=people', 'top');

    // Save original values used by mod_rewrite_rules() for reference.
    $wp_home = home_url(); // get the old home
    update_option('home', '/'); // change to what you need
    $wp_index = $wp_rewrite->index;
    $wp_rewrite->index = 'blog/index.php';

    // Then actually call generate the .htaccess file rules as a string.
    $htaccess = $wp_rewrite->mod_rewrite_rules();

    // and write the string outside the WordPress root.
    file_put_contents(
        trailingslashit(dirname(ABSPATH)) . '.htaccess',
        $htaccess,
        FILE_APPEND
    );

    // Don't forget to set the original values back. :)
    $wp_rewrite->index = $wp_index;
    update_option('home', $wp_home);
}
register_activation_hook(__FILE__, 'make_my_redirects');

…那么你的/home/site/public_html/.htaccess文件中就会有这样的东西:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^product/ /blog/index.php?post_type=product [QSA,L]
RewriteRule ^people/ /blog/index.php?post_type=people [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]
</IfModule>

那么,有可能吗?是的,我猜。推荐吗?可能不是。:) 更容易给 WordPress 自己的目录。

于 2015-01-17T04:23:56.407 回答