如何在 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 頁面或帖子還有任何疑問嗎? 請在評價部分留下您的意見。