Wordpress页面块与媒体库项目冲突

bihw5rsg  于 2023-02-11  发布在  WordPress
关注(0)|答案(4)|浏览(163)

我创建了一个分配了自定义模板的新页面。当我访问该页面的url时,我看到的似乎是默认页面布局(不是我的模板),并且管理工具栏显示与媒体相关的选项(例如:编辑媒体)。
经过一番努力,我推断出这个网址一定指向一个媒体项目,我编辑了这个页面,“宾果”,实际的页面就像预期的那样出现了,当我访问原始网址(从第一个slug)时,我看到了相同的媒体项目。

**底线:**似乎巧合的是,页面和媒体项目共享相同的名称,这是不知何故导致WP的电线交叉。
**我的问题:**有人能帮我理解这种情况是如何/为什么发生的吗?wordpress是否会创建指向媒体库中所有内容的神奇永久链接(除了它们在wp-content/uploads/...中的位置)?

注:媒体项目已正常上载到媒体库(而不是FTP到根目录等)

r7s23pms

r7s23pms1#

是的,在WordPress中你不能有重复的slug/category/taxonomies/tags。所以如果你的主题允许媒体文件和固定链接有自己的页面,而slug和另一个是一样的,它通常会附加一个数字,因为数据库不喜欢它。

  • 媒体块 *“示例”
  • 页面slug*“示例”将不起作用,因为该slug已经存在,如果在管理中完成,它将自动将slug更改为“示例-1”。
5n0oy7gb

5n0oy7gb2#

我只是有这个问题,并修复它这样:

$post_s=get_posts('posts_per_page=-1');
        foreach($post_s as $p){
            $atts = get_posts('post_type=attachment&name='.$p->post_name.'&posts_per_page=-1&post_status=inherit');
            foreach($atts as $att){
                echo 'found!! '.$p->post_name;
                // Update post 37
                $my_post = array(
                      'ID'           => $atts->ID,
                      'post_name' => $att->post_name.'-image'
                );
                // Update the post into the database
                wp_update_post( $my_post );
            }
        }
amrnrhlw

amrnrhlw3#

这是一个迟来的答案,但我想给予alesub给出的答案的更清晰的版本。

function wp21418_append_to_post_name() {

    // Checks to see if the option images_updated has been set or has a value of true.
    if ( get_option( 'images_updated' ) === 'true' ) :
        return;
    endif;

    // get all attachment posts.
    $attachments = get_posts([
        'post_type' => 'attachment',
        'post_status' => 'inherit',
        'name' => $p->slug,
        'posts_per_page' => -1,
    ]);

    // For each attachment, loop and update the post_name
    foreach($attachments as $p){

        $attachment = array(
            'ID'           => $p->ID,
            'post_name' => $p->post_name.'-image'
        );
        // Update the post into the database
        wp_update_post( $attachment );

    }

    // Once everything is looped, add the option to the database.
    add_option( 'images_updated', 'true' );
}

add_action( 'after_setup_theme', 'wp21418_append_to_post_name' );

这个函数在主题设置完成后立即在一个action钩子上运行。第一行检查数据库images_updated中是否有一个选项。如果该选项存在,我们放弃该函数,它不做任何处理。否则,如果该选项不存在,它运行该函数并在最后设置该选项。
这使得它只运行一次。您不必在刷新后删除该函数。如果您想再次运行它,只需删除顶部的if语句。警告:这样做将在post_names的末尾添加另一个-image,即使它们已经有-image(例如-image-image
可能会有更多的文件名检查的情况下。将更新的答案,如果有人真的需要它。

iyfjxgzm

iyfjxgzm4#

  • 我尝试了其中一个建议的解决方案,结果得到了类似/bob-image-image-image-image/的附件页面。*

我建议不要盲目地使用alesub或disinfor的代码,而是使用一个更好的选项,即“禁用媒体页面”插件。
https://github.com/joppuyo/disable-media-pages
它会自动将所有附件插件设置为一个唯一的ID,并且可以选择损坏任何现有的附件插件,这样它们就不会在未来造成任何问题。

相关问题