函数文档

_wp_delete_customize_changeset_dependent_auto_drafts()

💡 云策文档标注

概述

此函数用于删除与指定 customize_changeset 关联的自动草稿文章。它通过解析 changeset 数据,处理在自定义菜单创建过程中生成的草稿文章。

关键要点

  • 函数 _wp_delete_customize_changeset_dependent_auto_drafts 接收一个 customize_changeset 的 post ID 作为参数。
  • 仅当 post_type 为 'customize_changeset' 且 post_content 中包含 nav_menus_created_posts 数据时执行操作。
  • 自动草稿(auto-draft)文章会被永久删除,而普通草稿(draft)文章则被移至回收站并删除相关元数据。
  • 在循环处理文章前移除并重新添加 delete_post 钩子,以避免递归调用。

代码示例

function _wp_delete_customize_changeset_dependent_auto_drafts( $post_id ) {
	$post = get_post( $post_id );

	if ( ! $post || 'customize_changeset' !== $post->post_type ) {
		return;
	}

	$data = json_decode( $post->post_content, true );
	if ( empty( $data['nav_menus_created_posts']['value'] ) ) {
		return;
	}
	remove_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
	foreach ( $data['nav_menus_created_posts']['value'] as $stub_post_id ) {
		if ( empty( $stub_post_id ) ) {
			continue;
		}
		if ( 'auto-draft' === get_post_status( $stub_post_id ) ) {
			wp_delete_post( $stub_post_id, true );
		} elseif ( 'draft' === get_post_status( $stub_post_id ) ) {
			wp_trash_post( $stub_post_id );
			delete_post_meta( $stub_post_id, '_customize_changeset_uuid' );
		}
	}
	add_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
}

注意事项

  • 此函数作为 delete_post 动作的钩子使用,确保在删除 customize_changeset 时清理相关草稿文章。
  • 开发者应避免直接调用此函数,而是依赖 WordPress 核心的自动清理机制。
  • 处理过程中临时移除钩子以防止无限循环,是标准的安全实践。

📄 原文内容

Deletes auto-draft posts associated with the supplied changeset.

Parameters

$post_idintrequired
Post ID for the customize_changeset.

Source

function _wp_delete_customize_changeset_dependent_auto_drafts( $post_id ) {
	$post = get_post( $post_id );

	if ( ! $post || 'customize_changeset' !== $post->post_type ) {
		return;
	}

	$data = json_decode( $post->post_content, true );
	if ( empty( $data['nav_menus_created_posts']['value'] ) ) {
		return;
	}
	remove_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
	foreach ( $data['nav_menus_created_posts']['value'] as $stub_post_id ) {
		if ( empty( $stub_post_id ) ) {
			continue;
		}
		if ( 'auto-draft' === get_post_status( $stub_post_id ) ) {
			wp_delete_post( $stub_post_id, true );
		} elseif ( 'draft' === get_post_status( $stub_post_id ) ) {
			wp_trash_post( $stub_post_id );
			delete_post_meta( $stub_post_id, '_customize_changeset_uuid' );
		}
	}
	add_action( 'delete_post', '_wp_delete_customize_changeset_dependent_auto_drafts' );
}

Changelog

Version Description
4.8.0 Introduced.