Jak dodać funkcję „duplikuj” do wszystkich postów w WordPressie – prosty kod PHP
Frustruje Cię, że WordPress nie ma wbudowanej opcji duplikowania postów? Ja też przez to przechodziłem. Za każdym razem, gdy chciałem stworzyć podobny wpis, musiałem wszystko przepisywać od zera. Albo instalować kolejny plugin…
Ale jest prostsze rozwiązanie. Dzisiaj pokażę Ci kod PHP, który doda przycisk „Duplikuj” do wszystkich Twoich postów, stron i niestandardowych typów treści. Zero pluginów, zero problemów.
Po co w ogóle duplikować posty?
Zanim przejdę do kodu, szybko wyjaśnię, dlaczego ta funkcja jest przydatna:
- Oszczędzasz czas – nie musisz od zera tworzyć podobnych wpisów
- Zachowujesz strukturę – wszystkie metadane, kategorie i tagi zostają skopiowane
- Testujesz wersje – możesz eksperymentować z różnymi wariantami tego samego contentu
- Tworzysz szablony – raz stworzony post możesz powielać i modyfikować
Jak działa ten kod?
Kod składa się z trzech części:
- Główna funkcja duplikowania – robi całą robotę
- Funkcja dodająca przycisk – wyświetla link „Duplikuj” w panelu
- Hook aktywujący funkcję – sprawia, że wszystko działa dla wszystkich typów postów
Część 1: Główna funkcja duplikowania
function wm_towp_duplicate_post_as_draft(){
global $wpdb;
// Sprawdza, czy jest post do duplikacji
if (! (isset($_GET['post']) || isset($_POST['post']) ||
(isset($_REQUEST['action']) && 'wm_towp_duplicate_post_as_draft' == $_REQUEST['action']))) {
wp_die('Brak postu do powielenia!');
}
// Pobiera ID posta
$post_id = (isset($_GET['post']) ? absint($_GET['post']) : absint($_POST['post']));
$post = get_post($post_id);
// Sprawdza uprawnienia
if (!current_user_can('edit_posts')) {
wp_die('Brak uprawnień.');
}
if (isset($post) && $post != null) {
// Tworzy nowy post
$new_post = array(
'post_title' => $post->post_title . ' (Kopia)',
'post_content' => $post->post_content,
'post_status' => 'draft',
'post_type' => $post->post_type,
'post_author' => get_current_user_id(),
'post_excerpt' => $post->post_excerpt,
'post_category' => wp_get_post_categories($post_id),
'post_parent' => $post->post_parent
);
$new_post_id = wp_insert_post($new_post);
// Kopiuje taksonomie (kategorie, tagi itp.)
$taxonomies = get_object_taxonomies($post->post_type);
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);
}
// Kopiuje metadane
$post_meta = $wpdb->get_results("SELECT meta_key, meta_value FROM $wpdb->postmeta WHERE post_id=$post_id");
if (count($post_meta)!=0) {
foreach ($post_meta as $meta) {
if ($meta->meta_key != '_wp_old_slug') {
update_post_meta($new_post_id, $meta->meta_key, maybe_unserialize($meta->meta_value));
}
}
}
// Przekierowuje do edycji nowego posta
wp_redirect(admin_url('post.php?action=edit&post=' . $new_post_id));
exit;
} else {
wp_die('Nie udało się powielić posta, coś poszło nie tak.');
}
}
add_action('admin_action_wm_towp_duplicate_post_as_draft', 'wm_towp_duplicate_post_as_draft');
Co się tutaj dzieje?
Funkcja pobiera wszystkie dane z oryginalnego posta – treść, tytuł, kategorie, tagi, metadane. Następnie tworzy nowy post jako kopię roboczą i automatycznie otwiera go do edycji.
Część 2: Dodanie przycisku „Duplikuj”
function wm_towp_duplicate_post_link($actions, $post) {
if (current_user_can('edit_posts')) {
$actions['duplicate'] = '<a href="' . wp_nonce_url('admin.php?action=wm_towp_duplicate_post_as_draft&post=' . $post->ID, basename(__FILE__), 'duplicate_nonce') . '" title="Powiel ten wpis" rel="permalink">Powiel</a>';
}
return $actions;
}
Ta funkcja dodaje link „Powiel” do listy akcji pod każdym postem w panelu administracyjnym.
Część 3: Aktywacja dla wszystkich typów postów
add_action('init', function () {
$post_types = get_post_types(['public' => true], 'names');
foreach ($post_types as $post_type) {
add_filter("{$post_type}_row_actions", 'wm_towp_duplicate_post_link', 10, 2);
}
});
To najfajniejsza część – kod automatycznie znajduje wszystkie publiczne typy postów (wpisy, strony, produkty WooCommerce itp.) i dodaje funkcję duplikowania do każdego z nich.
Jak zainstalować ten kod?
Opcja 1: Przez plik functions.php (najprotsza)
- Idź do Wygląd → Edytor motywów
- Znajdź plik
functions.php - Wklej kod na końcu pliku (przed zamykającym
?>jeśli istnieje) - Zapisz zmiany
Opcja 2: Jako plugin (bezpieczniejsza)
- Stwórz nowy plik, np.
duplicate-posts.php - Na początku dodaj nagłówek pluginu:
<?php
/**
* Plugin Name: Duplikuj posty
* Description: Dodaje funkcję duplikowania do wszystkich typów postów
* Version: 1.0 * Author: Twoje Imię
*/
// Zabezpieczenie przed bezpośrednim dostępem
if (!defined('ABSPATH')) { exit; }
// Tutaj wklej cały kod
- Wgraj plik do folderu
/wp-content/plugins/ - Aktywuj plugin w panelu administracyjnym
Co zyskujesz dzięki temu kodowi?
- Przycisk „Duplikuj” wszędzie – przy wpisach, stronach, produktach, niestandardowych postach
- Kompletne kopiowanie – wszystkie metadane, kategorie, tagi przechodzą do kopii
- Bezpieczeństwo – kod sprawdza uprawnienia użytkownika
- Automatyczne przekierowanie – od razu lądуjesz w edytorze nowego posta
- Zero wpływu na wydajność – kod działa tylko gdy go używasz
Dlaczego nie plugin?
Możesz zapytać: „Po co kod, skoro są pluginy do tego?”
Moja odpowiedź: Bo ten kod to 30 linijek, które robią dokładnie to, czego potrzebujesz. Plugin to często kilka tysięcy linijek, które spowalniają stronę i dodają funkcje, których nie używasz.
Plus masz pełną kontrolę. Chcesz zmienić tekst z „Kopia” na „Duplikat”? Jedna linijka kodu. W pluginie musisz szukać w ustawieniach albo prosić autora o zmianę.
Personalizacja kodu
Możesz łatwo dostosować kod do swoich potrzeb:
Zmiana nazwy kopii:
'post_title' => $post->post_title . ' (Wersja 2)',
Publikowanie od razu zamiast szkicu:
'post_status' => 'publish',
Ustawienie siebie jako autora:
'post_author' => get_current_user_id(),
Podsumowanie
Ten kod rozwiąże Twój problem z duplikowaniem postów raz na zawsze. Zero zewnętrznych pluginów, zero komplikacji. Po prostu skopiuj, wklej i już działa.
Najlepsze w tym wszystkim? Kod jest tak prosty, że nawet jeśli nie znasz PHP-a, łatwo zrozumiesz co robi każda część.
P.S. Pamiętaj o backupie przed dodawaniem kodu. Zawsze lepiej dmuchać na zimne. 😉