您无需执行任何操作,并且可以完全回避问题,使代码更快、更简单!
这就是我们要做的:
我们将使用课程文章作者,而不是名称,它更可靠,我们将避免原始SQL查询,以便使用缓存和WP_Query
我们将使用wp_insert_post
为了更新和创建帖子,请删除无用的array_map
打电话检查一下wp_insert_post
无论成功与否,我们将应用WP编码标准,以使其更易于阅读和更好地使用,例如现代PHP数组[]
而不是array()
, 严格的in_array
检查,无全局变量
计算课程ID的代码将移动到其自己的函数这样,当课程名称更改时,原始course
帖子的标题和URL已更新/更改,而不是创建全新的course
这需要清理旧球场。以下是一些接近实际情况的建议:
function get_course_by_author( $user_id ) : int {
// if we don\'t find anything then a value of 0 will create a new post rather than update an existing post.
$course_id = 0;
$args = [
\'post_type\' => \'course\',
\'posts_per_page\' => 1,
\'post_author\' => $user_id,
];
$query = new WP_Query( $args );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$course_id = get_the_ID();
// we only want a single post ID
break;
}
// cleanup after the query
wp_reset_postdata();
} else {
// perhaps the course was created before post authors were set? Fall back to looking for the post by its slug/name
return 0;
}
return $course_id;
}
function get_course_by_slug( string $slug ) : int {
$course_id = 0;
$args = [
\'post_type\' => \'course\',
\'posts_per_page\' => 1,
\'post_name\' => $slug,
];
... etc etc see get_course_by_author ...
return $course_id;
}
function handle_course_post( $user_id = \'\' ) {
// First, is this user an instructor?
$user = get_user_by( \'ID\', $user_id );
if ( ! $user || ! in_array( \'instructor\', $user->roles, true ) ) {
return;
}
// get the course name
$course_name = get_user_meta( $user_id, \'course_name\', true );
if ( empty( $course_name ) {
error_log( "the user does not have a course_name!" );
}
// Then lets find this users course if it exists.
// if we don\'t find anything then a value of 0 will create a new post rather than update an existing post.
$course_id = get_course_by_author( $user_id );
if ( $course_id === 0 ) {
// we didn\'t find a course with that author, try the course name.
$course_id = get_course_by_slug( $course_name );
}
// Finally, save/update the course!
$content = \'This is the page for: \';
$content .= get_user_meta( $user_id, \'description_course\', true );
$args = [
\'ID\' => $course_id,
\'post_title\' => $course_name,
\'post_name\' => $course_name, // set the slug/permalink
\'post_content\' => $content,
\'post_status\' => \'publish\',
\'post_type\' => \'course\',
];
$post_id = wp_insert_post( $args );
// check if we were succesful.
if ( is_wp_error( $post_id ) ) {
// it didn\'t work!
error_log( $post_id->get_error_message() );
} else if ( empty( $post_id ) ) {
// it didn\'t work!
error_log( "post_id is empty/false" );
}
}
add_action( \'personal_options_update\', \'handle_course_post\' );
add_action( \'edit_user_profile_update\', \'handle_course_post\' );
请记住,这是未经测试的,需要一些理解,它不能按原样复制粘贴(尽管如果它按原样工作,那就好了!)。
请注意,在结束时,我们检查wp_insert_post
是否工作。我们不能假设它是成功的,如果另一个用户已经选择了该课程名称怎么办?如果用户不再是讲师怎么办?
还要记住,您现有的course
帖子没有合适的作者,需要重新保存。一旦完成,所有案件都将得到处理。如果上面的代码无法通过作者找到课程帖子,那么它将尝试通过slug获取课程帖子,允许部分迁移路径。
这确实意味着你原来的问题仍然会发生,但只会发生在那些从未更新过个人资料并立即更改课程名称的用户身上。那些保存个人资料然后更改名称的人将被处理,所有未来的用户也将被处理。