PHP - запустить функцию для каждого файла в каталоге, передавая два параметра
Я должен начать с того, что у меня нет опыта работы с php, но я знаю, что этот скрипт не может быть таким амбициозным.
Я использую API WordWeblog Wordpress для создания нескольких сотен постов. Каждому сообщению нужен отдельный заголовок, описание и URL для двух изображений, причем последние являются настраиваемыми полями.
Я успешно выполнил один пост, вручную введя данные в следующий файл;
<?php // metaWeblog.Post.php
$BLOGURL = "http://path/to/your/wordpress";
$USERNAME = "username";
$PASSWORD = "password";
function get_response($URL, $context) {
if(!function_exists('curl_init')) {
die ("Curl PHP package not installed\n");
}
/*Initializing CURL*/
$curlHandle = curl_init();
/*The URL to be downloaded is set*/
curl_setopt($curlHandle, CURLOPT_URL, $URL);
curl_setopt($curlHandle, CURLOPT_HEADER, false);
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $context);
/*Now execute the CURL, download the URL specified*/
$response = curl_exec($curlHandle);
return $response;
}
function createPost(){
/*The contents of your post*/
$description = "post description";
/*Forming the content of blog post*/
$content['title'] = $postTitle;
$content['description'] = $description;
/*Pass custom fields*/
$content['custom_fields'] = array(
array( 'key' => 'port_thumb_image_url', 'value' => "$imagePath" ),
array( 'key' => 'port_large_image_url', 'value' => "$imagePath" )
);
/*Whether the post has to be published*/
$toPublish = false;//false means post will be draft
$request = xmlrpc_encode_request("metaWeblog.newPost",
array(1,$USERNAME, $PASSWORD, $content, $toPublish));
/*Making the request to wordpress XMLRPC of your blog*/
$xmlresponse = get_response($BLOGURL."/xmlrpc.php", $request);
$postID = xmlrpc_decode($xmlresponse);
echo $postID;
}
?>
В попытке сохранить это кратко, вот самый основной пример сценария, который выполняет итерацию по каталогу и "должен" передавать переменные $ postTitle и $ imagePath и создавать сообщения.
<?php // fileLoop.php
require('path/to/metaWeblog.Post.php');
$folder = 'foldername';
$urlBase = "images/portfolio/$folder";//truncate path to images
if ($handle = opendir("path/to/local/images/portfolio/$folder/")) {
/*Loop through files in truncated directory*/
while (false !== ($file = readdir($handle))) {
$info = pathinfo($file);
$file_name = basename($file,'.'.$info['extension']); // strip file extension
$postTitle = preg_replace("/\.0|\./", " ", $file_name); // Make file name suitable for post title !LEAVE!
echo "<tr><td>$postTitle</td>";
$imagePath = "$urlBase/$file";
echo " <td>$urlBase/$file</td>";
createPost($postTitle, $imagePath);
}
closedir($handle);
}
?>
Это должно работать так,
- fileLoop.php открывает каталог и перебирает каждый файл
- для каждого файла в каталоге создается подходящий заголовок записи (postTitle) и создается URL-путь (imagePath) к файлу сервера
- каждый postTitle и imagePath передаются функции createPost в metaWeblog.php
- metaWeblog.php создает сообщение и передает его обратно, чтобы завершить создание строки таблицы для каждого файла в каталоге.
Я попытался объявить функцию в fileLoop.php, я попытался объединить файлы полностью. Он либо создает таблицу со всеми файлами, либо не проходит через каталог таким образом. Я что-то упустил, я это знаю. Я не знаю, как включить сюда $POST_ или использовать сессии, как я сказал, что я новичок в программировании на php.
1 ответ
Вам необходимо обновить декларацию createPost()
Функция так, чтобы она учитывала параметры, которые вы пытаетесь отправить.
Так и должно быть примерно так:
function createPost($postTitle, $imagePath){
/*The contents of your post*/
$description = "post description";
...
}
Более подробную информацию об аргументах функций PHP можно найти на соответствующей странице руководства.
После исправления вы можете использовать отладку CURL для получения дополнительной информации о вашем внешнем запросе. Чтобы получить больше информации о запросе CURL, попробуйте установить следующие параметры:
/*Initializing CURL*/
$curlHandle = curl_init();
/*The URL to be downloaded is set*/
curl_setopt($curlHandle, CURLOPT_URL, $URL);
curl_setopt($curlHandle, CURLOPT_HEADER, false);
curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array("Content-Type: text/xml"));
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, $context);
curl_setopt($curlHandle, CURLOPT_HEADER, true); // Display headers
curl_setopt($curlHandle, CURLOPT_VERBOSE, true); // Display communication with server
/*Now execute the CURL, download the URL specified*/
$response = curl_exec($curlHandle);
print "<pre>\n";
print_r(curl_getinfo($ch)); // get error info
echo "\n\ncURL error number:" .curl_errno($ch); // print error info
echo "\n\ncURL error:" . curl_error($ch);
print "</pre>\n";
Приведенный выше пример кода отладки взят со страниц справки eBay.
Он должен показать вам, если Wordpress отклоняет запрос.