Zapisywanie danych o postach WP w pliku CSV


Uwaga! Wszystkie informacje i solucje zawarte w postach typu DYI mogą z czasem przestać być aktualne. Niektóre publikowane kody źródłowe, będąc zależnymi od używanych konfiguracji platform i sprzętu, mogą nie działać, lub działać nieprawidłowo u niektórych użytkowników. Stosując opisane rozwiązania przyjmujesz do wiadomości i zgadzasz się, że nie ponoszę odpowiedzialności za ich finalne efekty.


Czy Twoja strona na WordPress’ie ma pierdyliardy postów, a akurat zaistniała potrzeba żeby przeprowadzić audyt obrazów (oraz sprawdzić np. czy we wszystkich postach zostały wprowadzone opisy)? Ponieważ czas ma swoją wartość, nie ma żadnej potrzeby, żebyś posty przeglądał jeden za drugim (bo zajęłoby to miliard lat i doprowadziłoby do ślepoty 😀 ). Przedstawiam Ci skrypt, który wylistuje wszystkie posty, poda daty ich publikacji, tytuły, adresy, a także wskaże w których postach i jakie pokazuje obrazy.

Kod należy umieścić w pliku php o dowolnej nazwie, wrzucić go na serwer w miejscu, gdzie znajduje się plik wp_config.php, a następnie wywołać go z poziomu przeglądarki. Po przetworzeniu danych skrypt zapisze plik.csv w tej samej lokalizacji, a w przeglądarce wyświetli komunikat: „Plik CSV został utworzony: posts.csv”.

CSV (comma separated values) – to format przechowywania danych w plikach tekstowych. Format obsługiwany jest przez prawie wszystkie popularne pakiety biurowe (Microsoft Office, LibreOffice, iWork, PolarisOffice itp.). Stąd też wygenerowany plik z łatwością można poddać dalszej obróbce np. w Excel’u.

<?php
require_once('wp-config.php');
require_once('wp-load.php'); // Załaduj WordPressa, aby mieć dostęp do jego funkcji

// Ustawienia połączenia z bazą danych
$servername = DB_HOST;
$username = DB_USER;
$password = DB_PASSWORD;
$dbname = DB_NAME;

// Folder z obrazami - użytkownik podaje pełny URL do folderu
$image_folder_url = '/upl/'; // Podaj link folderu, w którym zapisywane są obrazy, np. /wp-content/uploads/

// Połączenie z bazą danych
$conn = new mysqli($servername, $username, $password, $dbname);

// Sprawdzenie połączenia
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

// Zapytanie SQL do pobrania postów
$sql = "SELECT ID, post_date, post_title, post_content FROM wp_posts WHERE post_status = 'publish' AND post_type = 'post'";
$result = $conn->query($sql);

$posts = [];

// Przetwarzanie wyników
if ($result->num_rows > 0) {
while ($row = $result->fetch_assoc()) {
$post_id = $row['ID'];
$post_date = $row['post_date'];
$post_title = $row['post_title'];
$post_content = $row['post_content'];

// Generowanie linku do posta za pomocą wbudowanej funkcji WordPressa
$post_url = get_permalink($post_id);

// Wyciągnięcie pierwszego akapitu
$first_paragraph = '';
if (preg_match('/<p>(.*?)<\/p>/', $post_content, $matches)) {
$first_paragraph = strip_tags($matches[1]);
}

// Wyciągnięcie linków do obrazów
$image_urls = [];
if (preg_match_all('/<img[^>]+src="([^">]+)"/', $post_content, $matches)) {
foreach ($matches[1] as $img_url) {
// Sprawdzanie i zamiana ścieżki względnej na pełny URL
if (strpos($img_url, '/upl/') !== false) {
$img_url = str_replace('/upl/', $image_folder_url, $img_url);
} elseif (strpos($img_url, '/post/') !== false) {
$img_url = str_replace('/post/', 'https://domena.tld/post/', $img_url); //podaj adres do wygenerowania linków w pliku CSV
}
$image_urls[] = $img_url;
}
}

$posts[] = [
'date' => $post_date,
'title' => $post_title,
'url' => $post_url,
'description' => $first_paragraph,
'images' => $image_urls
];
}
}

$conn->close();

// Tworzenie pliku CSV
$filename = 'posts.csv';
$file = fopen($filename, 'w');

// Nagłówki kolumn
$headers = ['Data publikacji', 'Tytuł (Adres)', 'Adres strony', 'Opis', 'Obraz_1', 'Obraz_2', 'Obraz_3', 'Obraz_4', 'Obraz_5'];
fputcsv($file, $headers);

// Dodawanie danych do pliku
foreach ($posts as $post) {
$row_data = [
$post['date'],
$post['title'],
$post['url'],
$post['description']
];

// Dodawanie linków do obrazów
foreach ($post['images'] as $img_url) {
$row_data[] = $img_url;
}

// Dodanie pustych kolumn jeśli mniej niż 5 obrazów
while (count($row_data) < count($headers)) {
$row_data[] = '';
}

fputcsv($file, $row_data);
}

fclose($file);

echo "Plik CSV został utworzony: $filename";
?>