首页 > CMS教程 > &#&按 > 从CSV数据编程中创建WordPress帖子

从CSV数据编程中创建WordPress帖子

Joseph Gordon-Levitt
发布: 2025-02-18 09:46:09
原创
557 人浏览过

从CSV数据编程中创建WordPress帖子

钥匙要点

  • >利用php函数(例如glog(),fopen()和fgetCsv()从CSV文件中提取数据并为WordPress Post Creation做好准备。
  • >使用诸如自定义帖子类型UI和高级自定义字段之类的插件实现自定义帖子类型和字段,以有效地管理特定的内容要求。
  • 通过使用PHP版本5.3或更高版本来确保兼容性,以利用必要的功能(例如匿名功能)。
  • >仅通过管理启动操作执行脚本,保护未经授权的访问和数据损坏。
  • >通过用清晰的标头构造CSV文件来优化数据处理,并始终格式化以简化导入过程。
  • >通过检查文件权限并在数据导入过程之前和期间验证数据完整性来优雅地处理潜在错误。
  • 作为WordPress开发人员,我们经常遇到需要包括先前获得的数据的项目,无论是来自简单的文本文件,CSV文件,甚至是旧数据库。数据迁移是任何后端开发人员都会遇到的东西。几个月前,我们进行了一个项目,需要从大量CSV文件中生成近1,000个帖子。现在,通常这不是很难的
  • ,但是此数据也需要在其自己的帖子类型下,并且自定义帖子类型具有一些自定义字段,包括mp3文件的媒体附件。 >
  • >我不会为您提供用于创建自定义帖子类型和自定义字段的代码,因为该主题上的网络周围已经有大量文章。我只想提到我正在为每个任务使用自定义帖子类型UI和高级自定义字段。正如标题所暗示的那样,我们将要在这里介绍的内容是从编程中获取来自一堆CSV文件(有些包含多个帖子)的数据,然后将该数据转换为自定义帖子类型的WordPress帖子。我们甚至会浏览每个帖子的简单文本文件。
为了从CSV文件中获取我们需要的所有数据,我们将利用一些漂亮的PHP函数,例如:Glob(Glob(),它'Globs'一个目录,并返回一系列的文件名。它; Fopen(),它可以打开一个文件,以便我们可以阅读其内容,最后是FGETCSV(),该文件将CSV文件解析为一个不错的关联阵列,该数组包含我们所有的所有数据。

>实际上,我们将在本文中使用的大多数数据可能在单个CSV内文件。这样做是为了使此处使用的技术可以使用其他类型的数据(例如JSON,YAML甚至纯文本文件)实现。整篇文章的想法来自严重缺乏有关此主题的教程和文章,尤其是当您使用自定义帖子类型和自定义字段时。

了解我们的数据 >如果您想关注,则可以从此存储库中获取所需的CSV文件(以及本文中使用的所有代码)。好的,首先,让我们看一下我们要处理的CSV数据(请注意,“文件”列在那里,以表明我正在跨多个CSV文件传播所有这些数据)。

>文件

>标题 content 附件 虚拟CSV 一些标题 帖子的一些内容 附件1.txt dummy2.csv 一些标题2 帖子2的一些内容 附件2.txt dummy3.csv 帖子3的一些标题 第三篇文章的一些内容 entactment3.txt dummy3.csv 一些标题4 一些帖子4的内容 附件4.txt 非常简单,是吗?接下来,我们将查看我们将使用的自定义帖子类型。我使用自定义Post Type UI创建它,因此,如果您使用该插件,则可以使用相同的设置,或者使用WordPress的许多功能自己执行。这是我们将要使用的选项的快速屏幕截图(我正在突出显示我们将在本文中使用的slugs和其他字段,因此请记住这一点):> 最后,让我们看一下要使用的自定义字段。它是由可爱的高级自定义字段创建的。这是我们将要使用的设置的另一个快速屏幕截图。> >

请注意,您的自定义字段的ID可能与本文中使用的ID不同,因此请务必使用正确的ID更新$ SITEPONT数组。这可以是该字段的实际哈希键,也可以是字段的名称。为了清楚起见

从CSV数据编程中创建WordPress帖子几个先决条件

>值得一提的是,本文中使用的代码至少需要PHP 5.3。我们将利用匿名函数以及FGETCSV(),这两个都需要5.3,因此在您关闭并在旧的Rickety Production Server上使用此功能(请不要那样做)

,您可能需要升级。

>要提到的另一件事是,我不会进入PHP的max_execution_time,这在一次插入大量帖子时可能会引起一些问题。该设置因服务器而异,因此在本文中讨论它是不可行的。如果您想了解更多信息,请提供有关堆栈溢出的大量信息,以及有关如何增加最大执行时间的官方PHP文档的信息。

>

开始,让我们创建一个简单的按钮,该按钮在我们网站的后端

中执行我们的脚本。这将确保我们的代码仅由管理员我们执行。为此,我们将使用WordPress的admin_notices钩子。基本上,它要做的就是创建一个$ _ post变量,我们将使用该变量来确定我们是否应该将帖子插入数据库。

>我前面提到过,我们将在本文中使用匿名函数(为简单起见,我将它们称为关闭),其原因是,它并不值得用一堆函数污染全局名称空间本质上是投掷功能。关闭很棒,如果您不熟悉它们,我强烈建议您阅读它们。如果您来自JavaScript或Ruby背景,您会感到宾至如归。>

>如果要将所有这些代码都放入您的functions.php文件中,那很好,尽管如果要创建一个单独的页面模板,隐藏页面或其他任何内容,那也很好。最后,这真的没关系。首先,让我们使用另一个WordPress挂钩,Admin_init。我们还将包含$ WPDB全局,以便以后进行自定义数据库查询。
<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>
登录后复制
登录后复制
登录后复制

好吧,接下来呢?让我们从检查我们的$ _ post变量是否存在,如果不是,则可以退出功能。在一无所有的浪费记忆中无用。要检查是否存在变量,我们将使用$ _GET变量。如果您不熟悉这些类型的变量,则可以在此处阅读它们。除上述检查外,我们还将定义我之前提到的$ SITEPONT数组。它将包含您的自定义帖子类型和自定义字段ID。

值得注意的是,我在本文的代码中//时,这是我们涵盖的最后一个代码块的延续。本文中的大多数代码都在我们刚刚创建的Admin_init操作的关闭范围内。在文章的最后,我会为您提供完整的代码,因此请不要担心您是否丢失了一点。
<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等),此封闭情况都会有所不同。因此,我建议您对其进行调整以适合您的数据。我已经评论了下面的代码,以便您可以更好地遵循实际发生的事情。

>

其他注释: * $ array [] =“ value”语法对于array_push来说是简短的,它将分配的值推向数组的末尾。 *我将我的CSV数据存储在我的主题中,在数据/目录内。您可以在任何想要的地方存储它,但请记住将Glob()路径调整到您选择的任何东西。

>

<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()关闭以查看当前的帖子标题是否存在。

>因此,在下面的代码中,有很多数组和数据正在传递。我继续评论代码,以便您更好地了解所有内容。基本上,我们将帖子插入使用WP_INSERT_POST,并保存返回的帖子ID以供以后使用。然后,我们抓住上传目录,并通过创建上传文件的路径来创建所需的附件元数据(在上传/sitepoint-atcharthments中);然后最终抓住文件的名称和扩展名,我们将用来将附件插入我们新创建的帖子中。

>
<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数据编程中创建WordPress帖子

就是这样!就像我之前承诺的那样,这是本文中使用的所有代码:

>
<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帖子的编程

不像我们最初想象的那样硬。希望当需要迁移使用自定义帖子类型和自定义字段的数据时,这可以作为许多人的资源。就像我在文章开头所述的那样,许多代码(例如使用$ _POST变量的后端按钮)不应在生产站点中使用。本文中使用的代码应用作起点,而不是插件解决方案。> 我希望您喜欢这篇文章。如果您有任何疑问或评论,请随时将它们留在下面,我会尽力回答它们并解决您遇到的任何问题。快乐的编码!

>经常询问的问题(常见问题解答)从CSV数据中创建WordPress帖子

>从CSV数据创建WordPress帖子的重要性是什么?方式。如果您要从另一个平台迁移内容,或者您​​有大量需要批量上传的数据,这将特别有用。它可以节省时间和精力,因为您不必手动创建每个帖子。它还可以确保数据的一致性和准确性,因为它消除了人为错误的风险。

>我可以使用CSV文件以及帖子以及帖子吗?使用CSV文件。您需要将图像的URL包括在CSV文件中。导入CSV文件时,将从指定的URL获取图像并将其连接到相应的帖子。当您导入包含媒体内容的帖子时,此功能特别有用。

>我如何确保正确格式化了我的CSV文件中的数据以导入?

文件的格式正确以进行导入,您应遵循标准CSV格式。文件中的每一行应代表帖子,每列应代表帖子的字段。第一行应包括字段名称,例如“ post_title”,“ post_content”,“ post_status”等。随后的行应包括每个帖子的数据。确保使用逗号将每个字段分开,并将所有文本数据包装在引号中。

>如果导入过程中存在错误,会发生什么?

如果导入过程中存在错误,则导入函数将返回一个WP_ERROR对象,其中包含有关错误信息的信息。您可以使用此信息来解决问题。常见问题包括不正确的CSV格式,缺少所需字段和无效数据。请确保在导入之前仔细检查您的CSV文件以最大程度地降低错误的风险。

可以使用CSV导入更新现有帖子?您需要在CSV文件中包含帖子的ID。导入CSV文件时,如果已经存在具有相同ID的帖子,则现有帖子将使用新数据更新。当您需要大量更新大量帖子时,此功能特别有用。

我可以使用CSV文件导入自定义帖子类型吗?

是的,您可以使用CSV导入自定义帖子类型文件。您需要在CSV文件中包含帖子类型。导入CSV文件时,将使用指定的帖子类型创建帖子。当您使用自定义帖子类型并且需要导入大量数据时,此功能特别有用。

>

>我可以安排CSV文件的导入吗?不支持安排CSV文件的导入,而是提供此功能的可用插件。这些插件允许您为导入过程设置时间表,如果您需要定期从CSV文件导入数据,这可能特别有用。

我可以从远程位置导入CSV文件吗? >是的,您可以从远程位置导入CSV文件。您需要提供CSV文件的URL。导入CSV文件时,将从指定的URL获取数据。当CSV文件托管在远程服务器或云存储服务上时,此功能特别有用。

我可以将WordPress帖子导出到CSV文件吗?

是的,您可以导出WordPress帖子到CSV文件。此功能使您可以创建帖子的备份或将内容迁移到另一个平台。导出的CSV文件将包括帖子的所有数据,包括标题,内容,状态等。

我可以用其他语言导入CSV文件吗?其他语言的CSV文件。 WordPress支持多语言内容,因此您可以用任何语言导入帖子。但是,您需要确保在UTF-8中对CSV文件进行编码,以确保正确显示其他语言中的特殊字符。

>

以上是从CSV数据编程中创建WordPress帖子的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板