如何在 WordPress 中复制页面或帖子

已发表: 2021-08-26

正在寻找一种方法来复制 WordPress 页面、帖子或其他类型的内容?

能够轻松复制 WordPress 内容在所有类型的情况下都很有用,从批量创建类似内容到更新旧内容到调整设计等等。

但是,在许多情况下,这不仅仅是在不同页面之间复制和粘贴文本。 除了您创建的内容之外,您可能还希望保留其设计和帖子的设置,例如其类别、标签、作者、自定义字段和其他元数据。

在这篇文章中,我们将为您提供一个全面的指南,让您了解如何使用 100% 免费的解决方案完全复制 WordPress 页面、帖子等。

最后,只需单击一个按钮,您就可以复制您网站上的任何内容——让我们开始吧。

目录

  • 如何在 WordPress 中复制帖子或页面:三种方法
  • 如何使用插件复制 WordPress 页面
  • Yoast重复帖子
  • 重复帖子
  • WooCommerce
  • 如何使用编辑器复制 WordPress 页面
  • 块编辑器(古腾堡)
  • 元素
  • 如何使用代码手动复制 WordPress 页面
使用完整的网站工具包进一步加速您的网站创建过程

如何在 WordPress 中复制帖子或页面:三种方法

您可以使用三种主要方法来复制 WordPress 页面、帖子或其他自定义帖子类型:

  • 插件– 复制帖子或页面的最简单方法是使用众多专用插件之一(其中大部分是免费的)。
  • 编辑器- 根据您想要复制内容的彻底程度,如果您只关心复制内容和设计,则可以只使用编辑器。
  • 手动代码- 对于自己动手的人,您只需将一些自定义代码添加到您的子主题的 functions.php 文件中即可。

我们将涵盖所有三种方法——让我们来看看它们……

如何使用插件复制 WordPress 页面

有很多插件可以轻松复制您网站上的帖子、页面或其他内容。

如果您有 WooCommerce 商店,WooCommerce 会包含自己的内置功能来复制产品——更多内容见下文。 如果没有,您会在 WordPress.org 上找到许多免费插件,包括以下内容:

  • Yoast重复帖子
  • 重复帖子
  • 重复页面
  • 后复印机
  • 重复页面和帖子

除了 WooCommerce,我们还将向您展示它如何与上面列表中的两个免费插件配合使用:

  • Yoast Duplicate Post因为它非常易于使用并且包括一个独特的“重写和重新发布”功能,非常适合更新现有内容。
  • 重复帖子,因为它可以让您在某些方面进行更精细的控制。

这两个插件都是免费的,我们还对两者进行了测试,以确保它们适用于 Elementor 设计和使用本机 WordPress 编辑器构建的内容。 我们认为上面的所有其他插件也可以与 Elementor 一起使用,尽管我们没有专门测试它们。

Yoast重复帖子

首先,让我们来看看 Yoast Duplicate Post。 如果您只是想要一种快速简便的方法来复制帖子、页面或任何其他自定义帖子类型,则此插件非常有用。

除了让您克隆内容外,它还包括独特的重写和重新发布功能,可帮助您更新现有内容。 本质上,此功能可让您复制内容以进行更改,然后在您想要进行更改时将复制的版本“合并”回原始版本。

首先,从 WordPress.org 安装并激活免费的 Yoast Duplicate Post 插件。

现在,您有几种不同的方法来复制内容。

首先,您可以转到主要的帖子页面列表。 如果您将鼠标悬停在列表中的项目上,您将看到三个选项:

  • 克隆 -复制内容并将您的浏览器选项卡保留在帖子/页面列表中。
  • 新草稿- 复制内容并打开复制内容的编辑器,以便您可以立即开始工作。
  • 重写和重新发布- 正如我们上面讨论的,这是更新旧内容的有用功能。 关键的区别在于,它可以让您在完成后将内容合并回原始帖子。
重复页面 1 选项在页面列表中

最简单的方法是单击Clone 。 然后,您会看到重复内容的新草稿条目出现在列表中。 该插件将用“自定义草稿”通知标记它,让您知道它是重复版本:

其次,您还可以从 WordPress 编辑器内部复制内容。 您可以在帖子/页面侧边栏的状态和可见性部分找到这些选项:

最后,您还可以使用帖子页面列表的批量操作下拉列表中的插件选项批量复制帖子或页面:

  1. 使用复选框选择要复制的所有帖子或页面。
  2. 从下拉列表中选择复制方法 - CloneRewrite & Republish
  3. 点击应用

如果要自定义插件的行为,可以转到Settings → Duplicate Post 。 该区域可让您:

  • 选择要复制的内容。
  • 为重复内容的标题添加自定义前缀或后缀。
  • 在菜单中选择如何对重复的内容进行排序。
  • 选择哪些帖子类型符合复制条件。
  • 选择哪些用户角色可以复制内容。
  • 自定义在哪里显示重复的帖子链接/按钮。
重复页面 5-yoast-重复后设置区域

重复帖子

Duplicate Post 的基本功能与 Yoast Duplicate Post 相同,因为它可以轻松快速地复制帖子或页面。

这个插件相对于 Yoast Duplicate Post 的几个优点是:

  1. 让您一键复制帖子/页面多次。 例如,您可以告诉它创建四个副本。
  2. 使您可以更好地控制在帖子之间复制的内容。
  3. 包括扫描您的网站是否有重复内容的功能,这对于快速查找重复内容非常有用。
  4. 允许您在不同的 WordPress 多站点网络站点之间复制内容,包括子域上的站点(尽管此功能需要 19.98 美元的高级插件)。
  5. 为您提供将帖子转换为页面的选项,反之亦然(也需要高级版本)。

如果您不需要这些功能,我们建议您坚持使用 Yoast Duplicate Post,因为它更受欢迎并且可以完成工作。 但是,如果您确实想要这些功能,这是另一个值得考虑的可靠选择。

首先,从 WordPress.org 安装并激活免费的 Duplicate Post 插件。 只要您激活它,它就会开始工作。

转到帖子/页面列表并将鼠标悬停在要复制的内容上。 您将看到Copy的新选项。 如果将鼠标悬停在其上,您将展开一些其他设置以选择要进行多少次复制以及要使用哪些设置(稍后将详细介绍这些设置):

重复页面 6-重复后插件

与 Yoast Duplicate Post 一样,您还可以使用复选框和批量操作下拉菜单批量复制多个帖子。

要配置插件的设置,您可以转到 WordPress 仪表板中新的复制和删除帖子选项卡。 您可以在此处配置所有设置,包括:

  • 复制什么内容。
  • 谁可以复制内容。
  • 启用复制的自定义帖子类型。
  • 等等。

一件好事是,您可以创建多个设置配置文件,并在复制内容时选择要使用的配置。

如果您滚动到设置区域的底部,您还可以找到扫描您网站上重复内容的功能:

同样,如果您只是想要一种简单的方式来复制内容,我们建议您坚持使用 Yoast Duplicate Post 插件。 但是,如果这些功能中的任何一个引起了您的注意,Duplicate Post 也能很好地工作。

WooCommerce

如果您使用 WooCommerce 创建电子商务商店,WooCommerce 包含其自己的内置功能来复制产品 - 无需安装单独的插件。

要复制产品,请转到仪表板中的产品区域。 然后,将鼠标悬停在您要复制的产品上并单击Duplicate

您还可以通过单击发布设置下的复制到新草稿选项从产品编辑器内部复制产品:

注意– 这些选项仅出现在产品上。 如果您想复制帖子和页面,则需要安装上面的插件之一。

如何使用编辑器复制 WordPress 页面

如果您主要关心复制帖子或页面的内容/设计,由于一些内置的编辑器功能,您可能不需要插件就可以了。

在本节中,我们将向您展示如何快速复制您使用本机块编辑器 (Gutenberg) 或 Elementor 创建的设计。

需要注意的是,这两种方法都只会复制内容和设计——您需要手动重新创建任何重要的元数据,例如标题、类别、标签、自定义字段等。

块编辑器(古腾堡)

要从块编辑器快速复制内容,请首先打开要复制的帖子或页面的编辑器。

单击右上角的三点图标以展开菜单。 然后,选择复制所有内容的选项:

重复页面 11-重复内容古腾堡

现在,创建一个新的帖子或页面。 然后,单击进入编辑器并粘贴内容。 您可以:

  • 使用键盘快捷键,如Ctrl + VCmd + V
  • 右键单击并选择粘贴。

您应该会在编辑器中看到原始内容的精确副本。 但是,您需要确保手动添加标题、类别、标签等。

元素

注意- 您可以使用我们上面提到的插件复制使用 Elementor 构建的页面或帖子。 但是,如果您主要关心复制 Elementor 帖子/页面的设计(而不是作者和类别等其他元数据),则可以使用 Elementor 的模板系统来实现。

我们有一个关于如何复制 Elementor 页面的指南,但这是基本思想。

首先,您可以从 Elementor 编辑器界面将您的设计保存为模板:

重复页面 12-元素模板

然后,您可以创建一个新的帖子或页面,并从 Elementor 模板库中插入模板。

如果您想复制的不仅仅是单个页面,您还可以使用 Elementor 的网站工具包功能来导出/导入完整的网站设计。

通过导入您自己的网站工具包来复制您的完整网站设计

Elementor 导入/导出功能允许您导入自己的作品并在几秒钟内创建一个新网站。 只需创建一个可用于多个项目的蓝图,或重复使用您最喜欢的 Web 创建。 然后,导出整个网站并将其应用于您的其他项目。

您可以使用自己的创作或从我们的设计师制作的网站工具包库中进行选择。 只需将它应用到您的网站,添加内容,并使其成为您自己的。

如何使用代码手动复制 WordPress 页面

如果您更喜欢自己动手 (DIY) 的方法,您还可以使用一些自定义代码创建自己的重复页面功能。 除了无需在您的站点上安装另一个插件之外,此方法不会增加插件路由的任何好处。

但是,如果避免使用其他插件对您很重要,那么这种方法很好,并且适用于常规编辑器内容和 Elementor。

要使用此代码,您需要将其添加到主题的functions.php文件或代码管理插件(如 Code Snippets)中。 如果将其添加到functions.php文件中,请确保使用子主题。

 <?php /* * Function for post duplication. Dups appear as drafts. User is redirected to the edit screen */ function rd_duplicate_post_as_draft(){ global $wpdb; if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) { wp_die('No post to duplicate has been supplied!'); } /* * Nonce verification */ if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) return; /* * get the original post id */ $post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) ); /* * and all the original post data then */ $post = get_post( $post_id ); /* * if you don't want current user to be the new post author, * then change next couple of lines to this: $new_post_author = $post->post_author; */ $current_user = wp_get_current_user(); $new_post_author = $current_user->ID; /* * if post data exists, create the post duplicate */ if (isset( $post ) && $post != null) { /* * new post data array */ $args = array( 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status, 'post_author' => $new_post_author, 'post_content' => $post->post_content, 'post_excerpt' => $post->post_excerpt, 'post_name' => $post->post_name, 'post_parent' => $post->post_parent, 'post_password' => $post->post_password, 'post_status' => 'draft', 'post_title' => $post->post_title, 'post_type' => $post->post_type, 'to_ping' => $post->to_ping, 'menu_order' => $post->menu_order ); /* * insert the post by wp_insert_post() function */ $new_post_id = wp_insert_post( $args ); /* * get all current post terms ad set them to the new post draft */ $taxonomies = get_object_taxonomies($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag"); foreach ($taxonomies as $taxonomy) { $post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs')); wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); } /* * duplicate all post meta just in two SQL queries */ $post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id"); if (count($post_meta_infos)!=0) { $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) "; foreach ($post_meta_infos as $meta_info) { $meta_key = $meta_info->meta_key; if( $meta_key == '_wp_old_slug' ) continue; $meta_value = addslashes($meta_info->meta_value); $sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'"; } $sql_query.= implode(" UNION ALL ", $sql_query_sel); $wpdb->query($sql_query); } /* * finally, redirect to the edit post screen for the new draft */ wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) ); exit; } else { wp_die('Post creation failed, could not find original post: ' . $post_id); } } add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' ); /* * Add the duplicate link to action list for post_row_actions */ function rd_duplicate_post_link( $actions, $post ) { if (current_user_can('edit_posts')) { $actions['duplicate'] = 'ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate this item" rel="permalink">Duplicate'; } return $actions; } add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 ); <code readonly="true">&lt;?php /* * Function for post duplication. Dups appear as drafts. User is redirected to the edit screen */ function rd_duplicate_post_as_draft(){ global $wpdb; if (! ( isset( $_GET[&#39;post&#39;]) || isset( $_POST[&#39;post&#39;]) || ( isset($_REQUEST[&#39;action&#39;]) &amp;&amp; &#39;rd_duplicate_post_as_draft&#39; == $_REQUEST[&#39;action&#39;] ) ) ) { wp_die(&#39;No post to duplicate has been supplied!&#39;); } /* * Nonce verification */ if ( !isset( $_GET[&#39;duplicate_nonce&#39;] ) || !wp_verify_nonce( $_GET[&#39;duplicate_nonce&#39;], basename( __FILE__ ) ) ) return; /* * get the original post id */ $post_id = (isset($_GET[&#39;post&#39;]) ? absint( $_GET[&#39;post&#39;] ) : absint( $_POST[&#39;post&#39;] ) ); /* * and all the original post data then */ $post = get_post( $post_id ); /* * if you don&#39;t want current user to be the new post author, * then change next couple of lines to this: $new_post_author = $post-&gt;post_author; */ $current_user = wp_get_current_user(); $new_post_author = $current_user-&gt;ID; /* * if post data exists, create the post duplicate */ if (isset( $post ) &amp;&amp; $post != null) { /* * new post data array */ $args = array( &#39;comment_status&#39; =&gt; $post-&gt;comment_status, &#39;ping_status&#39; =&gt; $post-&gt;ping_status, &#39;post_author&#39; =&gt; $new_post_author, &#39;post_content&#39; =&gt; $post-&gt;post_content, &#39;post_excerpt&#39; =&gt; $post-&gt;post_excerpt, &#39;post_name&#39; =&gt; $post-&gt;post_name, &#39;post_parent&#39; =&gt; $post-&gt;post_parent, &#39;post_password&#39; =&gt; $post-&gt;post_password, &#39;post_status&#39; =&gt; &#39;draft&#39;, &#39;post_title&#39; =&gt; $post-&gt;post_title, &#39;post_type&#39; =&gt; $post-&gt;post_type, &#39;to_ping&#39; =&gt; $post-&gt;to_ping, &#39;menu_order&#39; =&gt; $post-&gt;menu_order ); /* * insert the post by wp_insert_post() function */ $new_post_id = wp_insert_post( $args ); /* * get all current post terms ad set them to the new post draft */ $taxonomies = get_object_taxonomies($post-&gt;post_type); // returns array of taxonomy names for post type, ex array(&quot;category&quot;, &quot;post_tag&quot;); foreach ($taxonomies as $taxonomy) { $post_terms = wp_get_object_terms($post_id, $taxonomy, array(&#39;fields&#39; =&gt; &#39;slugs&#39;)); wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); } /* * duplicate all post meta just in two SQL queries */ $post_meta_infos = $wpdb-&gt;get_results(&quot;SELECT meta_key, meta_value FROM $wpdb-&gt;postmeta WHERE post_id=$post_id&quot;); if (count($post_meta_infos)!=0) { $sql_query = &quot;INSERT INTO $wpdb-&gt;postmeta (post_id, meta_key, meta_value) &quot;; foreach ($post_meta_infos as $meta_info) { $meta_key = $meta_info-&gt;meta_key; if( $meta_key == &#39;_wp_old_slug&#39; ) continue; $meta_value = addslashes($meta_info-&gt;meta_value); $sql_query_sel[]= &quot;SELECT $new_post_id, &#39;$meta_key&#39;, &#39;$meta_value&#39;&quot;; } $sql_query.= implode(&quot; UNION ALL &quot;, $sql_query_sel); $wpdb-&gt;query($sql_query); } /* * finally, redirect to the edit post screen for the new draft */ wp_redirect( admin_url( &#39;post.php?action=edit&amp;post=&#39; . $new_post_id ) ); exit; } else { wp_die(&#39;Post creation failed, could not find original post: &#39; . $post_id); } } add_action( &#39;admin_action_rd_duplicate_post_as_draft&#39;, &#39;rd_duplicate_post_as_draft&#39; ); /* * Add the duplicate link to action list for post_row_actions */ function rd_duplicate_post_link( $actions, $post ) { if (current_user_can(&#39;edit_posts&#39;)) { $actions[&#39;duplicate&#39;] = &#39;ID, basename(__FILE__), &#39;duplicate_nonce&#39; ) . &#39;&quot; title=&quot;Duplicate this item&quot; rel=&quot;permalink&quot;&gt;Duplicate&#39;; } return $actions; } add_filter( &#39;post_row_actions&#39;, &#39;rd_duplicate_post_link&#39;, 10, 2 );</code> <?php /* * Function for post duplication. Dups appear as drafts. User is redirected to the edit screen */ function rd_duplicate_post_as_draft(){ global $wpdb; if (! ( isset( $_GET['post']) || isset( $_POST['post']) || ( isset($_REQUEST['action']) && 'rd_duplicate_post_as_draft' == $_REQUEST['action'] ) ) ) { wp_die('No post to duplicate has been supplied!'); } /* * Nonce verification */ if ( !isset( $_GET['duplicate_nonce'] ) || !wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) return; /* * get the original post id */ $post_id = (isset($_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) ); /* * and all the original post data then */ $post = get_post( $post_id ); /* * if you don't want current user to be the new post author, * then change next couple of lines to this: $new_post_author = $post->post_author; */ $current_user = wp_get_current_user(); $new_post_author = $current_user->ID; /* * if post data exists, create the post duplicate */ if (isset( $post ) && $post != null) { /* * new post data array */ $args = array( 'comment_status' => $post->comment_status, 'ping_status' => $post->ping_status, 'post_author' => $new_post_author, 'post_content' => $post->post_content, 'post_excerpt' => $post->post_excerpt, 'post_name' => $post->post_name, 'post_parent' => $post->post_parent, 'post_password' => $post->post_password, 'post_status' => 'draft', 'post_title' => $post->post_title, 'post_type' => $post->post_type, 'to_ping' => $post->to_ping, 'menu_order' => $post->menu_order ); /* * insert the post by wp_insert_post() function */ $new_post_id = wp_insert_post( $args ); /* * get all current post terms ad set them to the new post draft */ $taxonomies = get_object_taxonomies($post->post_type); // returns array of taxonomy names for post type, ex array("category", "post_tag"); foreach ($taxonomies as $taxonomy) { $post_terms = wp_get_object_terms($post_id, $taxonomy, array('fields' => 'slugs')); wp_set_object_terms($new_post_id, $post_terms, $taxonomy, false); } /* * duplicate all post meta just in two SQL queries */ $post_meta_infos = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id"); if (count($post_meta_infos)!=0) { $sql_query = "INSERT INTO $wpdb->postmeta (post_id, meta_key, meta_value) "; foreach ($post_meta_infos as $meta_info) { $meta_key = $meta_info->meta_key; if( $meta_key == '_wp_old_slug' ) continue; $meta_value = addslashes($meta_info->meta_value); $sql_query_sel[]= "SELECT $new_post_id, '$meta_key', '$meta_value'"; } $sql_query.= implode(" UNION ALL ", $sql_query_sel); $wpdb->query($sql_query); } /* * finally, redirect to the edit post screen for the new draft */ wp_redirect( admin_url( 'post.php?action=edit&post=' . $new_post_id ) ); exit; } else { wp_die('Post creation failed, could not find original post: ' . $post_id); } } add_action( 'admin_action_rd_duplicate_post_as_draft', 'rd_duplicate_post_as_draft' ); /* * Add the duplicate link to action list for post_row_actions */ function rd_duplicate_post_link( $actions, $post ) { if (current_user_can('edit_posts')) { $actions['duplicate'] = 'ID, basename(__FILE__), 'duplicate_nonce' ) . '" title="Duplicate this item" rel="permalink">Duplicate'; } return $actions; } add_filter( 'post_row_actions', 'rd_duplicate_post_link', 10, 2 );
			

默认情况下,该代码段为帖子和页面启用复制。 如果您只想为其中一个启用它,您可以删除代码段底部的page_row_actionspost_row_actions过滤器。

通过复制页面和帖子来改进您的 Web 创建过程

当您在 WordPress 网站上工作时,能够复制 WordPress 页面、帖子或其他帖子类型非常方便。

在这篇文章中,我们分享了您可以用来复制内容的三种不同方法。

对于大多数人来说,完全克隆帖子或页面的最简单方法是通过免费的 Yoast Duplicate Post 插件。 它立即开始工作,并与块编辑器 (Gutenberg)、Elementor 和 Classic TinyMCE 编辑器配合使用。 它还适用于所有帖子类型,从页面到帖子以及您可能使用的任何自定义帖子类型。

如果您有 WooCommerce 商店,您还可以使用 WooCommerce 的内置功能来复制产品。 或者,如果您不想安装其他插件,您可以向您的站点添加一些自定义代码。

最后,如果您只需要复制帖子的内容/设计,您可以使用 Elementor 的模板系统或使用块编辑器的选项来复制所有内容。

在我们走之前,快速提醒一下。 在大多数情况下,您不想发布重复的内容,因为它会对您的 SEO 产生负面影响。 因此,如果您在不更改其内容的情况下复制页面(可能只是为了更改 URL),那么您将需要考虑在完成后重定向原始页面。

您对如何复制 WordPress 页面或帖子还有任何疑问吗? 请在评价部分留下您的意见。