>实际上,我们将在本文中使用的大多数数据可能在单个CSV内文件。这样做是为了使此处使用的技术可以使用其他类型的数据(例如JSON,YAML甚至纯文本文件)实现。整篇文章的想法来自严重缺乏有关此主题的教程和文章,尤其是当您使用自定义帖子类型和自定义字段时。
了解我们的数据 >如果您想关注,则可以从此存储库中获取所需的CSV文件(以及本文中使用的所有代码)。好的,首先,让我们看一下我们要处理的CSV数据(请注意,“文件”列在那里,以表明我正在跨多个CSV文件传播所有这些数据)。
>标题
请注意,您的自定义字段的ID可能与本文中使用的ID不同,因此请务必使用正确的ID更新$ SITEPONT数组。这可以是该字段的实际哈希键,也可以是字段的名称。为了清楚起见
>值得一提的是,本文中使用的代码至少需要PHP 5.3。我们将利用匿名函数以及FGETCSV(),这两个都需要5.3,因此在您关闭并在旧的Rickety Production Server上使用此功能(请不要那样做)
,您可能需要升级。 >要提到的另一件事是,我不会进入PHP的max_execution_time,这在一次插入大量帖子时可能会引起一些问题。该设置因服务器而异,因此在本文中讨论它是不可行的。如果您想了解更多信息,请提供有关堆栈溢出的大量信息,以及有关如何增加最大执行时间的官方PHP文档的信息。
>我前面提到过,我们将在本文中使用匿名函数(为简单起见,我将它们称为关闭),其原因是,它并不值得用一堆函数污染全局名称空间本质上是投掷功能。关闭很棒,如果您不熟悉它们,我强烈建议您阅读它们。如果您来自JavaScript或Ruby背景,您会感到宾至如归。>
>
>
>
>因此,在下面的代码中,有很多数组和数据正在传递。我继续评论代码,以便您更好地了解所有内容。基本上,我们将帖子插入使用WP_INSERT_POST,并保存返回的帖子ID以供以后使用。然后,我们抓住上传目录,并通过创建上传文件的路径来创建所需的附件元数据(在上传/sitepoint-atcharthments中);然后最终抓住文件的名称和扩展名,我们将用来将附件插入我们新创建的帖子中。 >那么,下一步是什么?尽可能简单地说:我们按下按钮。我们所有的辛勤工作都将获得回报(希望如此!)。当我们按下按钮时,我们的代码应检查帖子变量,然后将其贯穿我们的脚本并插入我们的帖子。很好,容易。这是我们所有人的视觉人员的屏幕截图: 就是这样!就像我之前承诺的那样,这是本文中使用的所有代码: 不像我们最初想象的那样硬。希望当需要迁移使用自定义帖子类型和自定义字段的数据时,这可以作为许多人的资源。就像我在文章开头所述的那样,许多代码(例如使用$ _POST变量的后端按钮)不应在生产站点中使用。本文中使用的代码应用作起点,而不是插件解决方案。>
我希望您喜欢这篇文章。如果您有任何疑问或评论,请随时将它们留在下面,我会尽力回答它们并解决您遇到的任何问题。快乐的编码! >经常询问的问题(常见问题解答)从CSV数据中创建WordPress帖子
文件的格式正确以进行导入,您应遵循标准CSV格式。文件中的每一行应代表帖子,每列应代表帖子的字段。第一行应包括字段名称,例如“ post_title”,“ post_content”,“ post_status”等。随后的行应包括每个帖子的数据。确保使用逗号将每个字段分开,并将所有文本数据包装在引号中。 如果导入过程中存在错误,则导入函数将返回一个WP_ERROR对象,其中包含有关错误信息的信息。您可以使用此信息来解决问题。常见问题包括不正确的CSV格式,缺少所需字段和无效数据。请确保在导入之前仔细检查您的CSV文件以最大程度地降低错误的风险。 我可以使用CSV文件导入自定义帖子类型吗? 是的,您可以导出WordPress帖子到CSV文件。此功能使您可以创建帖子的备份或将内容迁移到另一个平台。导出的CSV文件将包括帖子的所有数据,包括标题,内容,状态等。开始,让我们创建一个简单的按钮,该按钮在我们网站的后端
中执行我们的脚本。这将确保我们的代码仅由管理员我们执行。为此,我们将使用WordPress的admin_notices钩子。基本上,它要做的就是创建一个$ _ post变量,我们将使用该变量来确定我们是否应该将帖子插入数据库。
<span>/**
</span><span> * Show 'insert posts' button on backend
</span><span> */
</span><span>add_action( "admin_notices", function() {
</span> <span>echo "<div class='updated'>";
</span> <span>echo "<p>";
</span> <span>echo "To insert the posts into the database, click the button to the right.";
</span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>";
</span> <span>echo "</p>";
</span> <span>echo "</div>";
</span><span>});</span>
<span>/**
</span><span> * Show 'insert posts' button on backend
</span><span> */
</span><span>add_action( "admin_notices", function() {
</span> <span>echo "<div class='updated'>";
</span> <span>echo "<p>";
</span> <span>echo "To insert the posts into the database, click the button to the right.";
</span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>";
</span> <span>echo "</p>";
</span> <span>echo "</div>";
</span><span>});</span>
接下来,让我们创建一个封闭式,将获取我们的CSV数据并创建所有数据的不错的关联数组。现在,很高兴注意到,取决于您使用的数据类型(无论是CSV,JSON,YAML等),此封闭情况都会有所不同。因此,我建议您对其进行调整以适合您的数据。我已经评论了下面的代码,以便您可以更好地遵循实际发生的事情。<span>/**
</span><span> * Create and insert posts from CSV files
</span><span> */
</span><span>add_action( "admin_init", function() {
</span> <span>global $wpdb;
</span>
<span>// ... code will go here
</span><span>});</span>
>如果您更像是一个视觉人(我知道我是),那么执行该封闭时返回的数据将是按照此目的的(您可以说的,并且已经有一个简单的模板对于某些错误处理,以防万一您想做一些疯狂的事情):<span>// ...
</span>
<span>global $wpdb;
</span>
<span>// I'd recommend replacing this with your own code to make sure
</span><span>// the post creation _only_ happens when you want it to.
</span><span>if ( ! isset( $_GET["insert_sitepoint_posts"] ) ) {
</span> <span>return;
</span><span>}
</span>
<span>// Change these to whatever you set
</span><span>$sitepoint = array(
</span> <span>"custom-field" => "sitepoint_post_attachment",
</span> <span>"custom-post-type" => "sitepoint_posts"
</span><span>);
</span>
<span>// ...</span>
>似乎并不多,但是足以完成工作。接下来,我们需要一个可以检查我们的帖子是否已经在数据库中的函数。没有什么比执行插入数百个帖子的脚本更糟糕的了,只是意识到它插入了两次。这个漂亮的封闭将询问数据库,并确保这不会发生。在此关闭中,我们将使用使用()函数,该函数允许我们访问闭合范围之外的变量。<span>// ...
</span>
<span>// Get the data from all those CSVs!
</span><span>$posts = function() {
</span> <span>$data = array();
</span> <span>$errors = array();
</span>
<span>// Get array of CSV files
</span> <span>$files = glob( __DIR__ . "/data/*.csv" );
</span>
<span>foreach ( $files as $file ) {
</span>
<span>// Attempt to change permissions if not readable
</span> <span>if ( ! is_readable( $file ) ) {
</span> <span>chmod( $file, 0744 );
</span> <span>}
</span>
<span>// Check if file is writable, then open it in 'read only' mode
</span> <span>if ( is_readable( $file ) && $_file = fopen( $file, "r" ) ) {
</span>
<span>// To sum this part up, all it really does is go row by
</span> <span>// row, column by column, saving all the data
</span> <span>$post = array();
</span>
<span>// Get first row in CSV, which is of course the headers
</span> <span>$header = fgetcsv( $_file );
</span>
<span>while ( $row = fgetcsv( $_file ) ) {
</span>
<span>foreach ( $header as $i => $key ) {
</span> <span>$post[$key] = $row[$i];
</span> <span>}
</span>
<span>$data[] = $post;
</span> <span>}
</span>
<span>fclose( $_file );
</span>
<span>} else {
</span> <span>$errors[] = "File '<span><span>$file</span>' could not be opened. Check the file's permissions to make sure it's readable by your server."</span>;
</span> <span>}
</span> <span>}
</span>
<span>if ( ! empty( $errors ) ) {
</span> <span>// ... do stuff with the errors
</span> <span>}
</span>
<span>return $data;
</span><span>};
</span>
<span>// ...</span>
>您可能想知道何时我们实际上将所有这些数据插入实际帖子,对吗?好吧,您可以确定的是,必须进行大量工作来确保所有这些数据都干净整理,并且我们设置了用于完成所需检查的功能。为了实现这一目标,我们将执行$ POST()关闭,以便我们可以循环浏览返回的数据。接下来,我们将执行$ post_exists()关闭以查看当前的帖子标题是否存在。
<span>/**
</span><span> * Show 'insert posts' button on backend
</span><span> */
</span><span>add_action( "admin_notices", function() {
</span> <span>echo "<div class='updated'>";
</span> <span>echo "<p>";
</span> <span>echo "To insert the posts into the database, click the button to the right.";
</span> <span>echo "<a class='button button-primary' style='margin:0.25em 1em' href='{$_SERVER["REQUEST_URI"]}&insert_sitepoint_posts'>Insert Posts</a>";
</span> <span>echo "</p>";
</span> <span>echo "</div>";
</span><span>});</span>
<span>/**
</span><span> * Create and insert posts from CSV files
</span><span> */
</span><span>add_action( "admin_init", function() {
</span> <span>global $wpdb;
</span>
<span>// ... code will go here
</span><span>});</span>
结论
从CSV数据中插入WordPress帖子的编程>如果导入过程中存在错误,会发生什么?
可以使用CSV导入更新现有帖子?您需要在CSV文件中包含帖子的ID。导入CSV文件时,如果已经存在具有相同ID的帖子,则现有帖子将使用新数据更新。当您需要大量更新大量帖子时,此功能特别有用。
>
>我可以安排CSV文件的导入吗?不支持安排CSV文件的导入,而是提供此功能的可用插件。这些插件允许您为导入过程设置时间表,如果您需要定期从CSV文件导入数据,这可能特别有用。
我可以将WordPress帖子导出到CSV文件吗?我可以用其他语言导入CSV文件吗?其他语言的CSV文件。 WordPress支持多语言内容,因此您可以用任何语言导入帖子。但是,您需要确保在UTF-8中对CSV文件进行编码,以确保正确显示其他语言中的特殊字符。
>
以上是从CSV数据编程中创建WordPress帖子的详细内容。更多信息请关注PHP中文网其他相关文章!