我正在寻找一个插件或一点php,它将通过大约300篇使用旧p格式超链接的帖子:
<a href="http://mysite.com/?p=3592">
并自动将其替换为他们的%postname%pretty permalink。例如:
<a href="http://mysite.com/my-post-about-whatever">
无论出于何种原因,当我们更改Permalink结构时,这些帖子不会自动神奇地做到这一点,所以我们目前正在逐一进行。数千个链接。我认为,问题是我们最初是从静态HTML页面导入它们的。
我想知道他们不会自动重写是不是因为我们使用了自定义的帖子类型?
或者,我们设置阻止自动重写的分类法的方式有问题吗?如果是,有人能提供一些建议吗。这是我们对这种自定义帖子类型(docs)的分类
//helpdocs taxonomy
add_action( \'init\', \'create_docs_post_type\' );
function create_docs_post_type() {
$labels = array(
\'name\' => __( \'Documentation\' ),
\'singular_name\' => __( \'Documentation\' )
);
$args = array(
\'labels\' => $labels,
\'public\' => true,
\'publicly_queryable\' => true,
\'show_ui\' => true,
\'show_in_menu\' => true,
\'query_var\' => true,
\'rewrite\' => true,
\'capability_type\' => \'page\',
\'has_archive\' => true,
\'hierarchical\' => true,
\'menu_position\' => 50,
\'supports\' => array( \'title\', \'editor\', \'author\', \'thumbnail\', \'excerpt\',
\'comments\', \'custom-fields\', \'revisions\',\'page-attributes\',\'post-formats\' )
);
register_post_type( \'docs\', $args);
}
function docs_init() {
// create a new taxonomy
register_taxonomy(
\'docs_tax\',
\'docs\',
array(
\'label\' => __( \'Documentation_Tax\' ),
\'sort\' => true,
\'args\' => array( \'orderby\' => \'term_order\' ),
\'hierarchical\' => true,
\'rewrite\' => array( \'slug\' => \'docs\' )
)
);
}
add_action( \'init\', \'docs_init\' );
TIA,
---JC公司
最合适的回答,由SO网友:gmazzap 整理而成
您可以循环您的帖子,提取URL,然后查看其中的查询变量来创建适当的链接,最后在中用新链接替换旧链接post_content
.
这种工作应该运行一次,所以我建议创建一个插件并在停用时运行此函数。
我还创建了一个助手函数,用于从帖子内容中提取URL。WP 3.7具有核心功能wp_extract_urls
, 然而,这个函数返回url时没有查询变量,因此对我们的作用域没有用处。
<?php
/**
* Plugin Name: Url Replacer
* Author: G.M.
*/
register_deactivation_hook( __FILE__, \'gm_replace_my_old_urls\' );
function my_extract_urls( $content ) {
preg_match_all("#<a.*?href=[\\"\\\'](http[s]*://[^>\\"]*?)[\\"\\\'][^>]*?>(.*?)</a>#si", $content, $urls);
$urls = array_unique( array_map( \'html_entity_decode\', $urls[1] ) );
return array_values( $urls );
}
function gm_replace_my_old_urls() {
$query = new WP_Query( array(\'posts_per_page\' => -1) );
if ( empty($query->posts) ) return;
foreach ( $query->posts as $post ) {
$urls = my_extract_urls($post->post_content);
if ( empty($urls) ) continue;
$new = array();
$old = array();
foreach ( $urls as $url ) {
if ( ! substr_count( $url, home_url() ) ) continue; // external url
$url_array = explode( \'?\', $url );
$qs = array();
if ( count($url_array) == 2 ) parse_str( $url_array[1], $qs );
if ( ! isset($qs[\'p\']) && ! isset($qs[\'page_id\']) ) continue;
$id = isset($qs[\'p\']) ? $qs[\'p\'] : $qs[\'page_id\'];
$link = get_permalink($id);
if ( ! $link ) continue;
$old[] = $url;
$new[] = $link;
}
if ( ! empty($new) ) {
$post = (array)$post;
$post[\'post_content\'] = str_replace($old, $new, $post[\'post_content\']);
wp_update_post($post);
}
}
}
将此代码保存在文件中并保存在插件文件夹中。之后,进入仪表板并激活它。什么都不应该发生。现在禁用插件。当插件被停用时,应该需要几秒钟的时间去检查你的帖子。。。