根据URL为single.php设置post_id,无需重定向

时间:2012-01-05 作者:Exit

我要迁移Joomla!Wordpress的数据库和网站必须保持URL的精确性。Joomla网站的帖子有。html扩展名,我创建的导入程序将Joomla文件URL映射到Wordpress post\\u名称,如下所示:

joomla现场。Joomla内容的com/标题。html->Wordpress DB::post\\u名称joomla内容的标题

我可以通过Wordpress网站直接访问Wordpress安装上的帖子。Joomla内容的com/标题

但我需要改变permalink系统的响应方式。我不想使用重定向(在标题中显示),所以我尝试挂接一个函数,如果URL以结尾,则该函数将以不同的方式选择帖子ID。html。

由于Wordpress仅在找不到文件时激活,因此real。html文件不受影响。所以对任何人都有全面的检查和更换功能。html文件不是问题。

我尝试过:

function custom_redirect() {
 global $post_id,$wpdb;
 if (substr($_SERVER[\'REQUEST_URI\'],-5) == \'.html\') {
    $check = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name=%s AND post_status = \'publish\'",substr(basename($_SERVER[\'REQUEST_URI\']),0,-5)));
    if ($check > 0) $post_id = $check;
    // Need to set the post ID for the wp_query here.
 }
}

if (!is_admin()) add_action( \'init\', \'custom_redirect\' );
上面的代码正确地选择了post ID,但我不确定使用什么函数或钩子来强制post(single.php)显示它。

我可以使用以下方法为每个归档设置帖子ID。php运行,但这不会影响单个。php文件,它只调用函数the\\u post。

function force_ID($query) {
 $query->set(\'post_id\', \'96\');
}
add_action(\'pre_get_posts\',\'force_ID\');
我觉得这可能很简单,比如更改$wp\\u查询的全局实例,但我不确定最好的方法。使用init钩子的执行顺序可能也太高了。

1 个回复
SO网友:Exit

我想出来了,这是其他任何想知道如何做这样的事情的人的解决方案:

function force_ID($query) {
 global $wpdb;
 if (substr($_SERVER[\'REQUEST_URI\'],-5) == \'.html\') {
    $post_id = $wpdb->get_var($wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name=%s AND post_status = \'publish\'",substr(basename($_SERVER[\'REQUEST_URI\']),0,-5)));
    if ($post_id > 0) $query->set(\'page_id\',$post_id);
 }
}
add_action(\'pre_get_posts\',\'force_ID\');
在检查wp包含/查询时。php文件中,我注意到该对象接受page\\u id以独占方式选择id。使用post\\u id可用于归档post循环,但page\\u id可用于单个post调用。

结束

相关推荐

Functions.php:从博客中排除类别

所以很明显,如何从模板中排除某些类别,但我不想修改4个模板,使它们忽略某个类别。有没有一种方法可以将某个类别从阅读设置的“博客”集中排除?我正在将博客分配到名为“博客”的页面。。。但显然,档案和搜索也需要对这一超出类别的内容视而不见。我宁愿在里面做functions.php