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

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

有时,您会遇到一种情况,即您想要创建与网站中现有文章或页面相同(或几乎相同)的新文章或页面。

如果文章或页面很长或包含大量媒体,重新添加所有内容的过程似乎非常费力。此外,如果您有很多彼此非常相似的文章,那么必须再次手动输入所有文本或添加所有媒体文件来创建新文章或页面会非常烦人。

一种选择可能是在一个浏览器窗口或选项卡中打开现有文章(为方便起见,我们将使用“文章”来指代文章和页面),然后在另一个窗口中创建新文章并在其中两个,复制和粘贴您的内容。毕竟,最近(古腾堡)版本的WordPress确实使这变得非常容易,您可以使用“复制所有内容”选项。

但是如果你必须一次又一次地这样做,就有犯错的风险。如果您不小心编辑了原始文章,覆盖了您已发布到网站的内容,该怎么办?或者,如果您要复制大量文章,而忘记创建了哪些文章?

这可能是一个潜在的头痛。

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

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

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

  • Duplicate Posts: 它在 WordPress 管理中为每个文章/页面添加一个“克隆”链接。
  • Duplicate Page plugin: 它在每个文章、页面或自定义文章类型下添加一个“复制此”链接。
  • WP Bulk Post Duplicator:此插件允许您批量复制文章/页面。

如果您使用WooCommerce并需要复制您的产品,请将鼠标悬停在任何产品上:您会在该产品下看到一个复制链接。

支持在这篇文章中,我们将向您展示一些可以用来执行此操作的方法,并重点介绍一些适合该任务的最佳插件。

但首先,我们将向您展示如何在没有插件的情况下以半手动方式在WordPress中复制页面或文章。这涉及复制和粘贴,但WordPress使这件事变得如此容易,如果您只有一个文章要复制,它可能会比安装插件并这样做更快。

如何在WordPress中复制页面或文章(半自动)

如果您只有一个文章要复制,这种方法会更快,因为它可以节省您安装插件的时间。如果你有一堆文章要复制,我强烈建议你跳过这一节:你会发现使用插件更快,更不用说更准确了。

所以对于那些只需要复制一篇文章或页面的人来说,这里是如何做到的。

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

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

WordPress中的复制所有内容选项

WordPress中的复制所有内容选项

将出现一个菜单。在此菜单的底部,您将看到“复制所有内容”选项。单击它,您将收到一条消息,告诉您您的内容已被复制。

现在创建您的新文章。为您的文章命名,然后单击编辑屏幕上为您创建的第一个空白区块。使用键盘上的快捷键进行粘贴(PC 上为 Ctrl + V,Mac 上为 Cmd + V,或右键单击并在出现的快捷菜单中选择粘贴。

您旧文章的内容现在将出现在您的新文章中。

现在您可以编辑该文章并使其与旧文章不同。这是我强烈建议做的事情——在您的网站上发布彼此完全重复的博客文章并没有多大意义。它不仅会使访问者感到困惑,而且对SEO也不利。

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

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

到目前为止,复制文章最快、最简单、最可靠的方法是使用插件。这将节省您的时间,避免任何人为错误,并允许您复制您喜欢的任何文章类型。事实上,根据我们的经验,复制文章实际上更常见于自定义文章类型。有两篇几乎完全相同的博客文章是不寻常的,但例如,对于商店中的产品来说,这是很常见的。

所以这里有一些插件可以简化复制文章的过程,以及如何使用它们的指南。

WooCommerce

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

但值得一提的是,WooCommerce允许您在不安装额外插件的情况下复制产品。因此,在您开始搜索后复制插件并使用它来复制您的产品之前,只需使用WooCommerce捆绑的功能即可。

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

WooCommerce重复产品选项

WooCommerce重复产品选项

只需单击该重复链接,就会创建一个新产品。您将被直接带到新产品的编辑屏幕,以便您可以对其进行更改然后发布。

值得注意的是,新产品的slug将是旧产品的slug加上-copy,所以即使你改变了新产品的标题,你也需要编辑slug。

编辑重复的产品

编辑重复的产品

Duplicate Post插件

Duplicate Post是最受欢迎的文章复制插件,下载量超过300万次。

激活它后,它会在WordPress管理员的主文章屏幕中为每个文章添加一个克隆链接。

Duplicate Post插件

Duplicate Post插件

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

然后你可以编辑那个新文章并给它一个新的标题(我强烈建议你这样做 – WordPress确实允许你复制标题,但它对用户体验不是很好)。

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

Duplicate Page

Duplicate Page插件已经有超过90万下载量,并且是重复的文章替代上述插件。

安装插件后,转到“文章”或“页面”管理屏幕,或转到自定义文章类型的管理屏幕,您会在每个文章下找到“Duplicate This”链接。这是我的自定义文章类型:

Duplicate Page插件

Duplicate Page插件

单击该链接,您将获得一个新文章(或页面,或自定义文章类型的文章),其内容和标题与原始文章相同,状态为草稿。在发布之前,您需要对其进行编辑并修改其slug。

注意:如果您使用WooCommerce,则此插件中的Duplicate This链接将不会显示在您的产品屏幕上。WooCommerce使用我在本文前面描述的自己的Duplicate链接覆盖它。

如何批量复制文章或页面

上面提到的插件可以让您一次复制一个文章。但是,如果您需要复制站点中的所有文章或自定义文章类型的所有文章,该怎么办?或者也许是你今年发表的所有文章?

WP Bulk Post Duplicator插件可以让你做到这一点。它没有添加链接来复制单个文章,而是为您提供了一个设置屏幕,让您可以根据您设置的条件批量复制文章。

注意:在撰写本文时,此插件已有四年未更新,因此我们建议在实际站点上使用之前将其安装在开发站点上并对其进行测试。

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

首先选择要复制的文章类型以及文章状态。因此,如果您选择已发布状态的post,该插件将复制您所有已发布的文章。相反,如果您选择postsdraft,它只会复制您的所有草稿文章。

批量复制设置 - 文章类型和状态

批量复制设置 – 文章类型和状态

向下滚动并选择要复制的文章的年份(这是可选的)。然后,您还可以指定创建的新文章的状态。如果您在此处不选择任何内容,它将默认为Draft

批量复制设置 - 年份和发布状态

批量复制设置 – 年份和发布状态

单击复制按钮,插件将复制您的文章。在这里你可以看到我所有的页面都被复制了,有12个现有的已发布页面和12个新的草稿页面。然后,我需要浏览所有页面并在发布它们之前对其进行编辑。这显然需要时间,但批量复制使速度更快,

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

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

没问题。只需按照以下步骤创建您自己的文章复制插件。

1. 设置插件

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

<?php
/*
Plugin Name: Wbolt Duplicate posts and pages
Plugin URI: https://www.wbolt.com
Description: Plugin to accompany post on duplicating posts in WordPress. Allows for duplication of posts and pages.
Version: 1.0
Author: MK
Author URI: https://www.wbolt.com
TextDomain: wbolt
License: GPLv2
*/

2. 创建函数

现在添加复制文章的函数并将其挂接到动作钩子上。这个动作钩子还不存在:别担心,我们很快就会创建它。

function wbolt_duplicate_post(){
}
add_action( 'admin_action_wbolt_duplicate_post', 'wbolt_duplicate_post' );

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

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

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

3. 添加复制函数

让我们添加复制代码。所有其余的代码都在您的空wb_duplicate_post() 函数中。

首先,让我们检查是否选择了有效的文章并检查随机数,以确保安全:

global $wpdb;

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

// 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.', 'wbolt' ) );
}

就是这样!

完整插件

这是插件的完整代码:

<?php

/* Plugin Name: Wbolt Duplicate posts and pages

Plugin URI: https://www.wbolt.com
Description: Plugin to accompany post on duplicating posts in WordPress. Allows for duplication of posts and pages. Version: 1.0 Author: Rachel McCollin
Author URI: https://www.wbolt.com
TextDomain: wbolt
License: GPLv2
*/

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

function wbolt_duplicate_post(){

global $wpdb;

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

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

// 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.', 'wbolt' ) );
 }

}
add_action( 'admin_action_wbolt_duplicate_post', 'wbolt_duplicate_post' );

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

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

 return $actions;

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

恭喜!您现在拥有自己的插件来复制WordPress网站中的文章和页面。

小结

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

如果您只有一篇文章要复制,您可能会发现使用WordPress中内置的“复制所有内容”功能会更快,但对于不止一篇文章,使用插件是值得的。如果您使用上面列出的插件之一,或者自己编写代码,您将能够根据需要复制任意数量的文章、页面或自定义文章类型。

如果你这样做,你会节省时间(更重要的是),当你应该编辑重复的文章时,你将消除意外编辑原始文章的风险。

评论留言