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:

  1. Główna funkcja duplikowania – robi całą robotę
  2. Funkcja dodająca przycisk – wyświetla link „Duplikuj” w panelu
  3. 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)

  1. Idź do Wygląd → Edytor motywów
  2. Znajdź plik functions.php
  3. Wklej kod na końcu pliku (przed zamykającym ?> jeśli istnieje)
  4. Zapisz zmiany

Opcja 2: Jako plugin (bezpieczniejsza)

  1. Stwórz nowy plik, np. duplicate-posts.php
  2. 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
  1. Wgraj plik do folderu /wp-content/plugins/
  2. 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. 😉