将旧链接更新为漂亮的固定链接自定义帖子类型

时间:2013-11-05 作者:jchwebdev

我正在寻找一个插件或一点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公司

1 个回复
最合适的回答,由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);
    }
  }
}
将此代码保存在文件中并保存在插件文件夹中。之后,进入仪表板并激活它。什么都不应该发生。现在禁用插件。当插件被停用时,应该需要几秒钟的时间去检查你的帖子。。。

结束

相关推荐

old permalinks not found

通过Google网站管理员工具查看,我有很多404个永久链接结构为/%年%/%月%/%日%/%postname%的帖子/此后,我将永久链接更改为/%类别%/%postname%。html我原以为Wordpress可以将旧的帖子URL重定向到新的帖子URL,但旧的基于日期的URL正在生成404。我的htaccess文件可写,设置为644。为什么会发生这种情况?谢谢

将旧链接更新为漂亮的固定链接自定义帖子类型 - 小码农CODE - 行之有效找到问题解决它

将旧链接更新为漂亮的固定链接自定义帖子类型

时间:2013-11-05 作者:jchwebdev

我正在寻找一个插件或一点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公司

1 个回复
最合适的回答,由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);
    }
  }
}
将此代码保存在文件中并保存在插件文件夹中。之后,进入仪表板并激活它。什么都不应该发生。现在禁用插件。当插件被停用时,应该需要几秒钟的时间去检查你的帖子。。。

相关推荐

Let me choose permalinks

我需要选择一个叫做“mysite”的永久链接。com/1418”,但wordpress不断在永久链接中添加“-2”。通常这意味着我已经有了一个名为“相同”的页面,它位于垃圾箱或其他地方。但这里的情况似乎并非如此。我尝试在设置中重置永久链接,这也没有帮助。我如何使用数字作为页面名称permalink,而不用wordpress在permalink中添加“-2”。