我正在开发一个具有不同添加内容方法的主题,因此,Wordpress 的默认安装不会因此显示任何内容。 我想知道是否可以在主题激活后通过内部函数和/或挂钩自动导入 XML 文件?
用户安装主题 > 用户激活主题 > 幕后代码加载 XML 文件并静默导入其内容
目前要导入 XML 文件,您必须安装适用于 WordPress 的 WordPress 导入程序插件,然后手动导入文件,选择用于关联导入内容的用户,并决定是否要导入媒体附件。 我发现此步骤对于我定位的客户类型来说太混乱了,因此我想有效地消除此步骤的需要。
我深入研究了 WordPress 导入程序脚本,发现有很多函数调用,我需要做什么才能去掉需要用户输入的部分并使用类及其方法目录导入文件? 我真的不知道从哪里开始。
我的客户是商人,所以即使是像导入 XML 文件这样简单的事情也会让他们感到困惑,他们没有时间去做,所以有出错的余地,尤其是当他们尝试导入不止一次导致页面重复时。
先感谢您。
编辑/澄清
这里似乎有很多混乱。 我不是在问如何检查主题是否已被激活,我已经对那部分进行了排序。 我在问我将如何解析 XML 导入文件并在无需用户操作的情况下自动导入它。 我基本上想要自动化 WordPress 导入插件,您已经可以使用它来手动导入 XML 文件,选择作者,选择下载并导入我的 functions.php 中的附件。
而不是需要插件或要求我的客户缺乏计算机知识,也不想学习如何使用插件。
如果您“只”想自动导入一些帖子/页面,您的问题有点具体。 还有其他方法可以使用 XML 导出文件来执行此操作。
如果你有纯文本帖子,那么你应该使用 LOAD DATA INFILE。 首先,您必须导出您的帖子。
global $wpdb, $wp_filesystem;
$tables = array(
'posts' => array( 'posts', 'postmeta' ),
'comments' => array( 'comments', 'commentmeta' ),
'terms' => array( 'terms', 'term_taxonomy', 'term_relationships' ),
'users' => array( 'user', 'usermeta' ),
'links' => array( 'links' ),
'options' => array( 'options' ),
'other' => array(),
// for multiside
'multiside' => array( 'blogs', 'signups', 'site', 'sitemeta', 'sitecategories', 'registration_log', 'blog_versions' )
);
$exports = array( 'posts', 'comments', 'users' );
$exportdir = TEMPLATEPATH . '/export';
if ( ! is_dir( $exportdir ) ) {
$mkdir = wp_mkdir_p( $exportdir );
if ( false == $mkdir || ! is_dir( $exportdir ) )
throw new Exception( 'Cannot create export directory. Aborting.' );
}
// empty the export dir else MySQL throws errors
$files = glob( $exportdir . '/*' );
if ( ! empty( $files ) ) {
foreach( $files as $file )
unlink( $file );
}
foreach ( $exports as $export ) {
if ( ! isset( $tables[$export] ) )
continue;
if ( ! empty( $tables[$export] ) ) {
foreach ( $tables[$export] as $table ) {
$outfile = sprintf( '%s/%s_dump.sql', $exportdir, $table );
$sql = "SELECT * FROM {$wpdb->$table} INTO OUTFILE '%s'";
$res = $wpdb->query( $wpdb->prepare( $sql, $outfile ) );
if ( is_wp_error( $res ) )
echo "<p>Cannot export {$table} into {$outfile}</p>";
}
}
}
这将在您的主题文件夹中创建一个目录(确保它是可写的!)并将帖子和评论(及其元数据)导出到转储文件中。 使用数组 export
定义要导出的内容。 我或多或少对大多数事情进行了分组(如果你想导出帖子,那么你还应该导出 postmeta 等等)。
这个解决方案的好处是,随着 SELECT
您可以定义特定内容的声明(例如,仅来自特殊类别的帖子或仅页面或仅已删除的帖子)。
现在您想将这些内容导入新博客
global $wpdb;
$exportdir = TEMPLATEPATH . '/export';
$files = glob( $exportdir . '/*_dump.sql' );
foreach ( $files as $file ) {
preg_match( '#/([^/]+)_dump.sql$#is', $file, $match );
if ( ! isset( $match[1] ) )
continue;
$sql = "LOAD DATA LOCAL INFILE '%s' INTO TABLE {$wpdb->$match[1]};";
$res = $wpdb->query( $wpdb->prepare( $sql, $file ) );
if ( is_wp_error( $res ) )
echo "<p>Cannot import data from file {$file} into table {$wpdb->$match[1]}</p>";
}
这个解决方案很好,如果帖子 没有 包含任何附件,如图像。 另一个问题是,不会导入任何用户和类别。 确保两者都在导入开始之前创建(或在导出中包括用户和类别)。 这是一种非常粗糙的导入方法,它会覆盖现有的东西!
如果您还想导出附件,则需要做更多的工作。
(旁注:请阅读完整的答案和最后的最后一句话!这个主题不适合初学者,我不会在每一行有风险的代码处写警告)
WordPress Importer Plugin 似乎是导入所有内容并自动导入/下载附件的好方法。 那么让我们看看这个插件会做什么。
首先,插件要求上传一个 XML 文件。 然后它解析 XML 文件并询问作者映射以及是否应下载附件。
为了自动运行插件,我们需要改变一些东西。 首先我们必须跳过上传过程。 这很容易,因为您可以将 XML 文件与主题捆绑在一起,并且您知道 XML 文件的位置。 然后我们要跳过上传 XML 文件后出现的问题。 我们可以预定义我们自己的值并将它们传递给导入过程。
从插件的副本开始。 在您的主题中创建一个目录,例如 autoimport
并复制文件 wordpress-importer.php
和 parsers.php
给它。 重命名文件是个好主意 wordpress-importer.php
到类似的东西 autoimporter.php
. 在您的主题函数中添加一个函数调用来触发自动导入
/**
* Auto import a XML file
*/
add_action( 'after_setup_theme', 'autoimport' );
function autoimport() {
// get the file
require_once TEMPLATEPATH . '/autoimport/autoimporter.php';
if ( ! class_exists( 'Auto_Importer' ) )
die( 'Auto_Importer not found' );
// call the function
$args = array(
'file' => TEMPLATEPATH . '/autoimport/import.xml',
'map_user_id' => 1
);
auto_import( $args );
}
首先我们设置一些参数。 首先是 XML 文件的完整路径。 第二个是一个ID 现存的 用户。 我们需要此用户进行作者映射,这是当不应创建新作者时所有帖子将映射到的用户。
现在我们必须了解插件的工作原理。 打开重命名的插件文件并向下滚动到末尾。 有一个功能 wordpress_importer_init()
和行动号召。 删除两个,不再需要它。 现在转到文件顶部并删除插件标头(文件开头的注释)。 之后,重命名类 WP_Importer
到类似的东西 Auto_Importer
不要忘记调整 function_exists
语句和第一种方法 WP_Importer
(这是 PHP4 风格的构造函数)。

稍后我们将把 XML 文件直接传递给类构造函数,将第一个方法修改为这个
var $xmlfile="";
var $map_user_id = 0;
function Auto_Importer( $args ) {
if ( file_exists( $args['file'] ) ) {
// for windows systems
$file = str_replace( '\\', "https://wordpress.stackexchange.com/", $args['file'] );
$this->xmlfile = $file;
}
if ( isset( $args['map_user_id'] ) )
$this->map_user_id = $args['map_user_id'];
}
现在我们有一个删除和修改类内部的一些方法。 第一种方法是 dispatch()
方法。 这个方法告诉你这个类是如何工作的。 它执行三个步骤。 首先上传XML文件,然后处理它,最后导入数据。
案例零是第一步,它是问候语。 这是您第一次调用导入时看到的部分。 它将要求上传文件。 案例二处理上传并显示导入选项的表单。 案例三最后做进口。 换句话说:前两个步骤只要求我们可以提供自己的数据。 我们只需要第 3 步(案例 2)并且必须提供第一步和第二步中要求的数据。
在第二步中,您会看到一个函数调用 wp_import_handle_upload()
. 此函数设置有关 xml 文件的一些信息。 我们不能再使用这个功能了,因为我们还没有上传文件。 所以我们必须复制和修改功能。 在类中创建一个新方法
function import_handle_upload() {
$url = get_template_directory_uri() . str_replace( TEMPLATEPATH, '', $this->xmlfile );
$type="application/xml"; // we know the mime type of our file
$file = $this->xmlfile;
$filename = basename( $this->xmlfile );
// Construct the object array
$object = array( 'post_title' => $filename,
'post_content' => $url,
'post_mime_type' => $type,
'guid' => $url,
'context' => 'import',
'post_status' => 'private'
);
// Save the data
$id = wp_insert_attachment( $object, $file );
// schedule a cleanup for one day from now in case of failed import or missing wp_import_cleanup() call
wp_schedule_single_event( time() + DAY_IN_SECONDS, 'importer_scheduled_cleanup', array( $id...
