重命名帖子ID-可以做吗?

时间:2019-01-16 作者:Brad Ahrens

是否可以在wp\\U posts表中更改post ID而不引起问题?

我这样问是因为我有一个WordPress多站点,其中我按语言将站点分开。不幸的是,每种语言的ID都是不同的,这使得链接有点复杂。

为了解决这个问题,我目前正在使用一个开关来检测页面所使用的语言,然后将ID分配给一个变量。有了这些信息,我就可以使用这个ID转义URL。

    $language = strtolower(mlp_get_current_blog_language(false));
    switch($language) {
        case "en_us": $downloads = 356; break;
        case "pt_pt": $downloads = 93; break;
        case "it_it": $downloads = 76; break;
        case "pt_br": $downloads = 59; break;
        case "nl_be": $downloads = 545; break;
        case "fr_be": $downloads = 596; break;
        case "de_de": $downloads = 356; break;
        case "es_es": $downloads = 545; break;
        case "fr_fr": $downloads = 545; break;
        case "es_mx": $downloads = 545; break;
        case "pl_pl": $downloads = 545; break;
    }
<a href="\'; echo esc_url( get_page_link( $downloads ) ); echo\'">
然而,如果我可以简单地将每个“下载”页面的ID重命名为“545”,那么我就不需要进行此切换。

有什么想法吗?这会破坏其他方面吗?

*注意,ID在其自己的表中是唯一的。有11张桌子。

*请注意,标题自始至终都是不同的,因为它们将与目标语言相匹配(telechargement、Desarga等)。所以,我也不能用这个。

谢谢

布拉德

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

是否可以在wp\\U posts表中更改post ID而不引起问题?

No it is not. 如果您更改了帖子ID,则必须完成并修复其他事项:

post元键/值对将不再具有正确的ID,分类法中的所有术语(如类别和标记)将不再附加到post,任何指向页面的nav菜单链接都将断开,在该页面上包含附件,任何缓存机制都需要刷新,否则会出现问题significant 工作量大,不值得这么麻烦

一般来说,如果您需要更改帖子的帖子ID,这是一个很大的警告,说明您所做的事情不正确,还有更简单的解决方案有待找到

为了解决这个问题,我目前正在使用一个开关来检测页面所使用的语言,然后将ID分配给一个变量。有了这些信息,我就可以使用这个ID转义URL。

如果这样做的全部目的是switch 我强烈建议不要这样做,不仅因为这是不明智的,而且因为它行不通。多篇文章不能有相同的ID。但也因为它是不必要的,并且可以使用一些基本的PHP使其变得更好

例如,您可以将case 共同声明:

    switch($language) {
        case "en_us":
        case "de_de":
            $downloads = 356;
            break;
        case "pt_pt": $downloads = 93; break;
        case "it_it": $downloads = 76; break;
        case "pt_br": $downloads = 59; break;
        case "fr_be": $downloads = 596; break;
        case "nl_be":
        case "es_es":
        case "fr_fr":
        case "es_mx":
        case "pl_pl":
            $downloads = 545;
            break;
    }
甚至使用default: 案例:

    switch($language) {
        case "en_us":
        case "de_de":
            $downloads = 356;
            break;
        case "pt_pt": $downloads = 93; break;
        case "it_it": $downloads = 76; break;
        case "pt_br": $downloads = 59; break;
        case "fr_be": $downloads = 596; break;
        default:
            $downloads = 545;
            break;
    }
或者最好使用数组:

$languages = [
    "en_us" => 356,
    "de_de" => 356,
    "pt_pt" => 93,
    "it_it" => 76,
    "pt_br" => 59,
    "fr_be" => 596,
];
$downloads = 545;
if ( !empty( $languages[$language])) {
    $downloads = $languages[$language];
}
但这仍然给我们留下了基本的反模式:

The magic number problem

该代码具有硬编码的post ID。如果您决定迁移、替换、导入等,代码将被破坏,因为ID可能不同。

Instead, use post slugs, 理想情况下,包含该语言。或者更好的是,使用MLP已经提供的API和功能,让插件为您完成工作