Wordpress 地址与站点地址不同时预览功能的修复方案 cover

Wordpress 地址与站点地址不同时预览功能的修复方案

一个小问题

2016/02/07 Update 发现还有两处会指向站点地址的预览入口:

文章列表页处于草稿状态下的文章的预览按钮:

  1. 修改\wp-admin\includes\class-wp-posts-list-table.php文件,搜索preview_post_link所在行注释掉
  2. 替换为: $url = apply_filters( 'preview_post_link', set_url_scheme( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) ); $url = str_replace("nemofq.com","nemofq.sinaapp.com","$url"); $actions['view']='<a href="'.esc_url($url).'"title="'.esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $title)).'" rel="permalink">'.__('Preview').'</a>';

处于草稿状态的文章编辑后点击保存草稿后,顶部的立即查看按钮:

  1. 修改\wp-admin\edit-form-advanced.php文件,搜索Post draft updated所在行注释掉(2处,分别为文章和页面)

  2. 在action的头部增加: $url = add_query_arg( 'preview', 'true', get_permalink($post_ID) );
    $url = str_replace("nemofq.com","nemofq.sinaapp.com","$url");

  3. 将注释掉的地方分别替换为: 10 => sprintf( __('Post draft updated. <a target="_blank" href="%s">Preview post</a>'), esc_url( $url ) ),
    10 => sprintf( __('Page draft updated. <a target="_blank" href="%s">Preview page</a>'), esc_url( $url ) ),

所以说,修Bug时候还是要尽量改通用的方法,偷懒的后果很可能就是遗漏问题或给后面修复类似问题时挖坑。另外直接改Wordpress的核心文件也不是官方推荐的方法,因为一旦版本升级时文件会被覆盖还得一个个再改一遍,官方推荐的是通过主题中的functions.php类似外挂一样地进行修改。不过我本来也就很久没升级了也就无所谓了。

以下为原文:

WordPress程序安装在子目录/使用SAE、BAE这样的云服务再绑定独立域名等情况下会出现Wordpress地址与站点地址不同的结果(后者其实可以相同,但不同可以加快后台访问速度及节省流量),此时后台的预览功能会失效,原因是WordPress会生成一个指向站点地址的预览地址,导致404或无权查看草稿。

WordPress官方论坛中存在大量类似的提问(很难相信一直未被修复...),经常被给出的解决方案是修改.htaccess文件加入相应的urlrewrite规则。基本思路是检查query_string中是否有preview=true,如果有则重写到新地址。但该方法一来复杂,二来对于SAE不适用。虽然SAE提供了Appconfig功能来替代.htaccess,但该方法中的url重定向规则会导致循环定向而失效。

更好的思路是直接更换后台生成的preview url。WordPress中一共存在三种预览:1)文章(未发布)预览;2)文章(已发布)预览;3)页面预览。三种预览均由\wp-admin\post.php控制,而url由\wp-admin\includes\post.php生成。url生成中用到了get_permalink函数,该函数被使用的场合较多故无法修改,又不存在一个对应到admin_url的相应函数,所以url生成过程并不好下手。最简洁的方案是直接修改\wp-admin\post.php中要传送给wp_redirect函数的url,即:

  1. 找到\wp-admin\post.php中 $url = post_preview(); 这一行;
  2. 在下面加上 $url = str_replace("site_url","admin_url","$url"); //其中site_url为你的站点地址(例如site.com),admin_url为你的WordPress安装地址(例如site.sinaapp.com)。

所谓的“定位问题、寻找解决方法、尝试不同方案的过程很容易就复杂且漫长,但最终的答案往往是极简的”。