如何在 WordPress 中复制页面或文章?

有时您会遇到这样的情况:您想要创建与您网站中现有的文章或页面相同(或几乎相同)的新文章或页面。如果文章或页面很长或包含大量媒体文件,重新添加所有内容会显得非常费力。此外,如果您有很多彼此非常相似的文章,那么手动重新输入所有文本或添加所有媒体文件来创建新文章或页面会非常麻烦。

一种方案是,在一个浏览器窗口或标签页中打开现有文章(为了方便起见,我们在此用“文章”来指代文章和页面),然后在另一个窗口创建新文章,并在两个窗口之间切换,复制粘贴内容。毕竟,*近(后 Gutenberg 时代)的 WordPress 版本确实让这变得非常容易,因为它提供了“复制所有内容”选项。

但如果您必须一遍又一遍地重复操作,就存在出错的风险。如果您不小心编辑了原始帖子,覆盖了您网站上已经发布的内容,该怎么办?或者,如果您需要复制大量文章,却忘记了哪些帖子是自己创建的,该怎么办?

这可能是一个潜在的令人头疼的问题。

  • 如何在 WordPress 中以半手动方式复制页面或帖子
  • 如何使用插件在 WordPress 中复制页面或文章
  • 如何批量复制文章或页面
  • 编写你自己的文章复制插件

幸运的是,有一种更简单的方法。有一些免费插件可以让你复制你的文章和页面,这样你就可以编辑和调整它们,创建与现有内容几乎完全相同的新文章。

如何在 WordPress 中复制页面或文章:

您可以使用以下插件之一轻松复制 WordPress 中的页面、文章和自定义文章类型:

  • 重复文章:它在 WordPress 管理员中向每个文章/页面添加“复制”链接。
  • 重复页面插件:它在每个文章、页面或自定义帖子类型下添加“重复”链接。
  • WP Bulk Post Duplicator:此插件允许您批量复制文章/页面。

如果您使用 WooCommerce 并需要复制您的产品,请将鼠标悬停在任何产品上:您将在该产品下看到一个复制链接。支持在这篇文章中,我们将向您展示一些可以用来执行此操作的方法,并重点介绍一些适合该任务的*佳插件。

首先,我们将向您展示如何在 WordPress 中以半手动的方式复制页面或文章,无需插件。这需要复制和粘贴,但 WordPress 让复制变得非常简单,如果您只需要复制一篇文章,那么复制可能比安装插件再复制要快得多。

如何在 WordPress 中以半手动方式复制页面或文章

如果您只需要复制一篇文章,这种方法会更快捷,因为它可以节省您安装插件的时间。如果您有很多帖子需要复制,我强烈建议您跳过本节:您会发现使用插件会更快,而且更准确。

因此,对于那些只需要复制一个文章或页面的人来说,下面是如何操作的方法。

首先打开您现有的文章或页面。请确保您没有选中单个区块,方法是点击文章区块外部,或选择屏幕右侧编辑窗格中的“文档”选项卡。如果您选中了某个区块,WordPress 将仅复制该区块的内容,而不是整个文档。

现在单击编辑屏幕右上角的省略号(三个叠在一起的点)。

复制页面或文章

这时会出现一个菜单。在菜单底部,你会看到一个“复制全部区块”选项。点击它,你会收到一条消息,提示你内容已被复制。

现在创建你的新文章。为文章添加标题,然后点击编辑屏幕上为你创建的*个空白区域。使用键盘上的粘贴快捷键(PC 上为 Ctrl + V,Mac 上为 Cmd + V,或右键单击并在出现的快捷菜单中选择“粘贴”)。

你之前的文章内容现在会显示在新文章里。

现在,您可以编辑该文章,使其与旧文章有所不同。我强烈建议您这样做——在您的网站上发布完全相同的文章毫无意义。这不仅会让访客感到困惑,而且对 SEO 也不利。

但是,如果你想创建多个文章的副本怎么办?继续阅读……

如何使用插件在 WordPress 中复制页面或文章

到目前为止,复制帖子*快捷、*简单、*可靠的方法是使用插件。这可以节省您的时间,避免任何人为错误,并允许您复制任何您想要的文章类型。事实上,根据我们的经验,复制文章在自定义文章类型中更为常见。两篇博客文章几乎完全相同的情况并不常见,但对于商店中的产品来说,这种情况却很常见。

因此,这里有一些插件可以简化复制帖子的过程,以及如何使用它们的指导。

WooCommerce

您可能想知道为什么我在这里包含 WooCommerce,因为它是一个电子商务插件,而不是文章复制插件。

但值得一提的是,WooCommerce 允许您复制产品​​而无需安装额外的插件。因此,在您开始搜索文章复制插件并使用它复制产品之前,请先使用 WooCommerce 捆绑的功能。

如果您转到 WooCommerce 中的主产品屏幕并将鼠标悬停在任何产品上,您将在该文章下方看到重复链接。

WooCommerce 重复产品选项

只需点击“复制”链接,即可创建一个新产品。您将直接进入新产品的编辑屏幕,以便对其进行修改并发布。

值得注意的是,新产品的 slug 将是旧产品的 slug加上-copy,因此即使您更改新产品的标题,您也需要编辑 slug。

重复文章【Duplicate Post 】插件

Duplicate Post 是*受欢迎的Duplicate Post 插件,下载量超过 300 万次。

一旦激活它,它会在 WordPress 管理员的主Post屏幕中为每个帖子添加一个克隆链接。

单击要复制的Post下方的克隆链接,将为您创建一个具有相同内容和标题且草稿状态的新Post。

然后,您可以编辑该新Post并为其指定一个新标题(我强烈建议这样做 – WordPress 确实允许您复制标题,但这对用户体验来说不是很好)。

它还将相同的克隆链接添加到页面和自定义帖子类型(如果您在设置中启用它们)。

Duplicate Page插件

Duplicate Page插件的下载量已超过 900,000 次,是上述 Duplicate Post 插件的替代品。

安装插件后,前往“帖子”或“页面”管理界面,或者前往自定义帖子类型的管理界面,您会在每个帖子下方找到“复制这个”链接。这是我自定义帖子类型的帖子:

点击链接,您将获得一篇新文章(或页面,或自定义文章类型的文章),其内容和标题与原始文章相同,状态为“草稿”。您需要先编辑并修改其 slug,然后才能发布。

注意:如果您使用的是 WooCommerce,此插件的“重复此”链接将不会显示在您的“产品”屏幕上。WooCommerce 会用它自己的“重复”链接覆盖它,正如我在本文前面所述。

如何批量复制帖子或页面

我之前提到的插件可以让你*复制一篇帖子。但是,如果你需要复制网站中的所有帖子,或者自定义帖子类型的所有帖子,或者你今年发布的所有帖子,该怎么办呢?

WP Bulk Post Duplicator插件可以帮你实现这一点。它不需要添加链接来复制单个帖子,而是提供一个设置界面,让你可以根据设置的条件批量复制帖子。

注意:截至撰写本文时,此插件已两年未更新,因此我们建议先在开发网站上安装并测试,然后再将其用于正式网站上。我们在测试网站上使用时没有遇到任何问题。

安装插件后,转到“设置”>“WP Bulk Post Duplicator”查看插件的设置屏幕。

首先选择要复制的帖子类型以及帖子状态。如果您选择“帖子”“已发布”,插件将复制所有已发布的帖子。如果您选择“帖子”“草稿”,则插件只会复制所有草稿帖子。

批量复制帖子或页面

向下滚动并选择要复制的帖子的年份(可选)。然后,您还可以指定新帖子的状态。如果您在此处未选择任何内容,则默认为“草稿”

点击“复制”按钮,插件就会复制你的帖子。在这里你可以看到我所有已复制的页面,包括 12 个已发布的页面和 12 个新的草稿页面。之后我需要仔细检查所有页面并进行编辑,然后再发布。这显然需要一些时间,但批量复制功能让这个过程变得更快。

编写你自己的文章复制插件

如果您不想使用第三方插件来复制帖子而宁愿自己编写代码怎么办?

没问题。只需按照以下步骤创建您自己的帖子复制插件即可。

1. 设置插件

首先设置插件。在 wp-content/plugins 文件夹中添加一个新文件,并将以下注释掉的文本添加到其中(您可以编辑该文件以反映您的作者姓名):

<?php
/*
Plugin Name:  TMC Duplicate posts and pages
Plugin URI: https://tkwlkj.com
Description: Plugin to TMC posst on duplicating posts in WordPress. Allows for duplication of posts and pages.
Version: 1.0
Author: Louis
Author URI: https://louishe.com
TextDomain: louishecom
License: GPLv2
*/

2.创建函数

现在添加复制帖子的功能,并将其挂接到一个动作钩子上。这个动作钩子目前还不存在:不用担心,我们很快就会创建它。

function kinsta_duplicate_post(){
}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

现在让我们创建该操作,它将作为将重复链接添加到帖子和页面屏幕的功能的一部分。

function kinsta_duplicate_post_link( $actions, $post ) {
 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }
 return $actions;
}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

这将添加用于复制的链接,但实际上还不会复制任何内容。

3. 添加复制功能

让我们添加复制代码。其余代码都放在空的 kinsta_duplicate_post() 函数中。

首先,为了安全起见,让我们检查是否选择了有效的帖子并检查随机数:

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {
 wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
 return;
}

现在我们需要获取要复制的帖子的 ID 及其数据:

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

我们可以使用它来定义一个参数数组,并使用 wp_insert_post() 将新帖子插入数据库,但首先,添加一个条件语句来检查帖子是否不为空:

if ( isset( $post ) && $post != null ) {

}

在条件语句中添加以下内容:

// args for new post
$args = array(
 'comment_status' => $post->comment_status,
 'ping_status'    => $post->ping_status,
 'post_author'    => $post->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 new post
$new_post_id = wp_insert_post( $args );

现在我们将从旧帖子中获取分类法并将其添加到新帖子中:

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );
}

然后我们将使用 SQL 查询添加任何额外的帖子元数据:

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
if ( count( $post_metas )!=0 ) {
 
$sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";
 
foreach ( $post_metas as $post_meta ) {
  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 );

}

*后,我们检查帖子的类型并重定向到相关屏幕。

// redirect to admin screen depending on post type
$posttype = get_post_type( $post_id );
wp_redirect( admin_url( 'edit.php?post_type=' . $posttype ) );

现在,在检查括号外面if ( isset( $post ) && $post != null ),我们添加一条错误消息:

else {
 // display an error message if the post id of the post to be duplicated can't be found
 wp_die( __( 'Post cannot be found. Please select a post to duplicate.', 'kinsta' ) );
}

就是这样!

完整插件

这是该插件的完整代码:

<?php

/*
Plugin Name:  TMC Duplicate posts and pages
Plugin URI: https://tkwlkj.com
Description: Plugin to TMC posst on duplicating posts in WordPress. Allows for duplication of posts and pages.
Version: 1.0
Author: Louis
Author URI: https://louishe.com
TextDomain: louishecom
License: GPLv2
*/

/********************************************************************
kinsta_duplicate_post() - duplicates the selected post
*********************************************************************/

function kinsta_duplicate_post(){

global $wpdb;

// Die if post not selected
if (! ( isset( $_GET['post']) || isset( $_POST['post'])  || ( isset($_REQUEST['action']) && 'kinsta_duplicate_post' == $_REQUEST['action'] ) ) ) {

wp_die( __( 'Please select a post to duplicate.', 'kinsta' ) );
}

// Verify nonce
if ( ! isset( $_GET['duplicate_nonce'] ) || ! wp_verify_nonce( $_GET['duplicate_nonce'], basename( __FILE__ ) ) ) {
return;
}

// Get id of post to be duplicated and data from it
$post_id = ( isset( $_GET['post']) ? absint( $_GET['post'] ) : absint( $_POST['post'] ) );
$post = get_post( $post_id );

// duplicate the post
if ( isset( $post ) && $post != null ) {

// args for new post
$args = array(
'comment_status' => $post->comment_status,
'ping_status'    => $post->ping_status,
'post_author'    => $post->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 new post
$new_post_id = wp_insert_post( $args );

// add taxonomy terms to the new post

// identify taxonomies that apply to the post type
$taxonomies = get_object_taxonomies( $post->post_type );

// add the taxonomy terms to the new post
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 );

}

// use SQL queries to duplicate postmeta
$post_metas = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");

if ( count( $post_metas )!=0 ) {
 
 $sql_query = "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) ";

 foreach ( $post_metas as $post_meta ) {

  $meta_key = $post_metas->meta_key;
  if( $meta_key == '_wp_old_slug' ) continue;
  $meta_value = addslashes( $post_metas->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 );

 }

 // redirect to admin screen depending on post type
 $posttype = get_post_type( $post_id );
 wp_redirect( admin_url( 'edit.php?post_type=' . $posttype ) );

 } else {

  // display an error message if the post id of the post to be duplicated can't be found
  wp_die( __( 'Post cannot be found. Please select a post to duplicate.', 'kinsta' ) );
 }

}
add_action( 'admin_action_kinsta_duplicate_post', 'kinsta_duplicate_post' );

// Add the duplicate link to action list for post_row_actions
function kinsta_duplicate_post_link( $actions, $post ) {

 if ( current_user_can( 'edit_posts') ) {
  $actions['duplicate'] = 'Duplicate';
 }

 return $actions;

}
add_filter( 'post_row_actions', 'kinsta_duplicate_post_link', 10, 2 );
add_filter( 'page_row_actions', 'kinsta_duplicate_post_link', 10, 2);

您还可以在 github 上找到完整的插件。

恭喜!现在您已经拥有了自己的插件,可以在 WordPress 网站中复制文章和页面。

总结

使用插件复制帖子和页面比手动复制更快,并且可以消除复制内容时出错的风险。

如果您只需要复制一篇文章,使用 WordPress 内置的“复制所有内容”功能可能会更快捷。但如果要复制多篇文章,则需要使用插件。如果您使用上面列出的插件之一,或者编写自己的代码,就可以根据需要复制任意数量的帖子、页面或自定义帖子类型。

如果您这样做,您将节省时间,并且(更重要的是),您将消除在应该编辑重复帖子时意外编辑原始帖子的风险。

滚动至顶部
扫描微信二维码联系我们 关闭