Czasami zachodzi konflikt interesów dotyczący adresów stron w WordPressie. Link to unikalny tekst generowany standardowo na bazie tytułu wpisu lub strony. WordPress generuje go do każdego typu postu w strukturze witryny. Jeżeli na serwer wgramy obrazek o nazwie 'pies.jpg', to otrzyma on link 'pies'. Gdy potem zrobimy wpis na blogu pod tytułem "Pies", to WordPress przypisze mu link 'pies‑2'. I mamy konflikt, bo link wpisu jest nieintuicyjny.
Można pamiętać, żeby zdjęcia miały inne linki, albo żeby wgrywać je potem (wtedy 'pies‑2' będzie przypisany do zdjęcia), ale po co się obciążać? Wystarczy przechwycić nazwę pliku wgrywanego do biblioteki mediów i zmodyfikować link tak, by nie powodował konfliktu z ważniejszymi od siebie.
Z pomocą przychodzi filtr wp_unique_post_slug, który wywołuje funkcję z sześcioma argumentami:
$slug (string) link postu. $post_ID (int) ID postu. $post_status (string) status postu. $post_type (string) Typ postu. $post_parent (int) ID postu nadrzędnego $original_slug (string) Oryginalny link postu.
Filtr wykonywany jest zawsze gdy zapisywany jest post. Jeżeli w funkcji zwrotnej nie wskażemy konkretnego przypadku, to link nie zmieni się. W poniższym przypadku wyłapany jest typ postu załącznik (attachment).
function append_attachment_slug( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) { if ( 'attachment' == $post_type ) $slug = $original_slug . uniqid( '-' ); return $slug; } add_filter( 'wp_unique_post_slug', 'append_attachment_slug', 10, 6 );
$slug przyjmuje połączoną wartość oryginalnego linku i wyniku funkcji PHP uniqid, która zwraca 13 znaków generowanych na bazie czasu. Ciągi połączone są myślnikiem (zawartość funkcji uniqid stanowi łącznik).
Filtr i funkcję można wgrać do pliku function.php lub w kodzie pluginu. Ja polecam instalację kodu w mu-plugins.
Pamiętaj, że filtr nie zmienia nazwy pliku, a jedynie link. Należy też stosować dobre praktyki, dotyczące wgrywanych zdjęć, aby uniknąć wielu kłopotów z odbiorem strony. Niedługo opiszę kilka, które sam stosuję.