【发布时间】:2010-12-23 11:56:08
【问题描述】:
当我们在 wordpress 中添加新帖子时,在提供帖子标题后,会自动生成 slug。我需要编辑该自动生成模块,以便我可以在 slug 的末尾自动添加一些任意数字。怎么做?
【问题讨论】:
当我们在 wordpress 中添加新帖子时,在提供帖子标题后,会自动生成 slug。我需要编辑该自动生成模块,以便我可以在 slug 的末尾自动添加一些任意数字。怎么做?
【问题讨论】:
不要使用 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;
}
但是,每次保存帖子时,这种方法都会改变 slug...这正是我所希望的...
编辑:
这种方法用于将生成限制为一次。唯一的缺点是它会在创建标题后运行 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;
}
【讨论】:
编写一个插件来挂钩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,并且它无法使用该编号更新现有帖子。
【讨论】:
wp_insert_post_data 被调用时,它必须通过我定义的函数,即append_slug,对吗? add_filter 的第三个参数(即10)有什么作用?
wp_insert_post_data 过滤器的所有函数(它实际上并不是 PHP 函数本身)。 WordPress 根据正在更新的帖子传递$data 和$postarr,因此您可以访问$data['post_name'](蛞蝓)。修改 slug 和 return $data 后,WordPress 将拥有更新的帖子数据,准备好在数据库中插入或更新。只需将其设为插件,激活它,WordPress 将自动处理其余部分。我相信每次保存帖子时都会调用此过滤器。
10 .. 它有什么作用?
Missing argument 2 for append_slug()
对此进行测试:(将其粘贴到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);
【讨论】:
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()或类似的东西,因为该函数每次都必须为同一个帖子返回相同的链接,否则你会遇到一些严重的问题。
玩得开心!
【讨论】:
$postarr 是否已经有ID - 但我不是 100% 的人
您应该使用wp_ajax_sample-permalink action 和name_save_pre filter 进行操作。
【讨论】: