在Wordpress中自定义Post Slug的自动生成

时间:2010-12-23 11:56:09

标签: php wordpress

当我们在wordpress中添加新帖子时,在提供帖子标题后,会自动生成slug。我需要编辑该自动生成模块,以便我可以自动在slug的末尾添加一些任意数字。怎么做?

5 个答案:

答案 0 :(得分:13)

请勿使用OP在此处使用的硬编码版本。当他这样做时,没有可用的过滤器。最近,自3.3以来,增加了一个过滤器。

add_filter( 'wp_unique_post_slug', 'custom_unique_post_slug', 10, 4 );
function custom_unique_post_slug( $slug, $post_ID, $post_status, $post_type ) {
    if ( $custom_post_type == $post_type ) {
        $slug = md5( time() );
    }
    return $slug;
}

然而,每次保存帖子时,这种方法都会改变slu ..这就是我所希望的......

修改

这种方法可以将生成限制为一次。唯一的缺点是,在创建标题后ajax运行时会创建一个版本,然后在保存帖子时创建另一个永久性slug。

function custom_unique_post_slug( $slug, $post_ID, $post_status, $post_type ) {
    if ( $custom_post_type == $post_type ) {
        $post = get_post($post_ID);
        if ( empty($post->post_name) || $slug != $post->post_name ) {
            $slug = md5( time() );
        }
    }
    return $slug;
}

答案 1 :(得分:2)

编写一个插件以挂钩wp_insert_post_data过滤器,以便在发送帖子以插入数据库之前更新slug:

function append_slug($data) {
    global $post_ID;

    if (empty($data['post_name'])) {
        $data['post_name'] = sanitize_title($data['post_title'], $post_ID);
        $data['post_name'] .= '-' . generate_arbitrary_number_here();
    }

    return $data;
}

add_filter('wp_insert_post_data', 'append_slug', 10);

请注意,此功能要求您允许WordPress首先自动生成slug,这意味着您不能在生成之前输入您自己的slug,并且它无法使用该数字更新现有帖子。

答案 2 :(得分:2)

测试:(将其粘贴到functions.php中)

function append_slug($data) {
global $post_ID;

if (!empty($data['post_name']) && $data['post_status'] == "publish" && $data['post_type'] == "post") {

        if( !is_numeric(substr($data['post_name'], -4)) ) {
            $random = rand(1111,9999);
            $data['post_name'] = sanitize_title($data['post_title'], $post_ID);
            $data['post_name'] .= '-' . $random;
        }

}
 return $data; } add_filter('wp_insert_post_data', 'append_slug', 10);

答案 3 :(得分:0)

   add_filter('post_link','postLinkFilter', 10, 3);

   /**
    * Manipulates the permalink
    *
    * @param string $permalink
    * @param stdClass $post
    * @return string
    */
   function postLinkFilter($permalink,stdClass $post){
        return $permalink.'?12345';
   }

在这种情况下未经测试,但我已经使用过它,应该使用最少的更改,但尝试正确地测试它。

在任何情况下,不要在这里使用rand()或类似的东西,因为每次都要为同一个帖子返回相同的链接,否则你会遇到一些严重的问题。

玩得开心!

答案 4 :(得分:0)

您应该使用wp_ajax_sample-permalink 操作name_save_pre 过滤器进行操作。

此处有更多示例:https://wordpress.stackexchange.com/a/190314/42702