#php #wordpress
#php #wordpress
Вопрос:
Я пытаюсь отредактировать несколько строк PHP-кода в моих файлах темы WordPress с помощью фрагмента PHP-кода, хотя я застрял и некоторое время пытался сделать это с помощью этого кода.
Я пытался настроить этот фрагмент кода для выполнения работы, но, к сожалению, безуспешно.
function update_GTour_theme_files()
{
$new_update = file_get_contents(__DIR__ . "/../../themes/grandtour/header.php");
$new_update = preg_replace('/$page_menu_transparent = 1/','$page_menu_transparent = 0',$new_update);
$new_update = preg_replace('/$grandtour_page_menu_transparent = 1/','$grandtour_page_menu_transparent = 0',$new_update);
file_put_contents (__DIR__ . "/../../themes/grandtour/header.php", $new_update);
if ( file_exists (__DIR__ . "/../../themes/grandtour/header.php") amp;amp; is_writable (__DIR__ . "/../../themes/grandtour/header.php") ){
update_GTour_theme_files();
echo '</br><span style="color:green;font-weight:bold;">Changes were applied successfully.</span>';
}
else {
echo '</br><span style="color:red;font-weight:bold;">Error occured while applying the changes.</span>';
}
}
Я ожидаю, что этот код должен заменить некоторый текст, как показано в файле, на описанный путь, но это не работает.
Комментарии:
1. это не работает не сильно помогает в решении вашей проблемы — вы получаете какие-либо сообщения об ошибках?
2. почему вы делаете это вместо непосредственного редактирования кода онлайн или в локальном текстовом редакторе? и для меня это выглядит так, как будто вы создаете бесконечный цикл, снова вызывая функцию внутри if ()
3. Всякий раз, когда я вызываю функцию с помощью кнопки формы, функция не дает желаемого результата, который заменяет текст. @jibsteroos
4. @Beatroot Этот фрагмент кода является лишь небольшой частью длительной процедуры по изменению нескольких файлов. Было бы быстрее и проще запустить один код, чтобы применить множество изменений к нескольким файлам в кратчайшие сроки.
5. Вы должны начать отладку.
Ответ №1:
С чего мне начать… позвольте мне сосчитать способы.
function update_GTour_theme_files()
{
$new_update = file_get_contents(__DIR__ . "/../../themes/grandtour/header.php");
$new_update = preg_replace('/$page_menu_transparent = 1/','$page_menu_transparent = 0',$new_update);
$new_update = preg_replace('/$grandtour_page_menu_transparent = 1/','$grandtour_page_menu_transparent = 0',$new_update);
file_put_contents (__DIR__ . "/../../themes/grandtour/header.php", $new_update);
if ( file_exists (__DIR__ . "/../../themes/grandtour/header.php") amp;amp; is_writable (__DIR__ . "/../../themes/grandtour/header.php") ){
update_GTour_theme_files();
echo '</br><span style="color:green;font-weight:bold;">Changes were applied successfully.</span>';
}
else {
echo '</br><span style="color:red;font-weight:bold;">Error occured while applying the changes.</span>';
}
}
Давайте посмотрим, когда вы запустите это, это сработает:
file_put_contents (__DIR__ . "/../../themes/grandtour/header.php", $new_update);
Затем он проверяет:
if ( file_exists (__DIR__ . "/../../themes/grandtour/header.php") amp;amp; is_writable (__DIR__ . "/../../themes/grandtour/header.php") ){
update_GTour_theme_files();
echo '</br><span style="color:green;font-weight:bold;">Changes were applied successfully.</span>';
}
Что, очевидно, верно, иначе мы бы уже получили некоторые ошибки. Так что это в принципе всегда верно. Что означает, что вы снова вызываете это update_GTour_theme_files();
само по себе. Повторите вышеуказанные шаги бесконечное количество раз.
Так что это явно неправильно. Если вы вызываете это, я бы ожидал, что ваш браузер заблокирован.
Итак, давайте исправим это (одним файлом):
function update_GTour_theme_files($file)
{
//fail early
if (!file_exists ($file) || !is_writable ($file) ) die("File $file Does not exists or is not writable");
$new_update = file_get_contents($file);
$new_update = preg_replace('/$page_menu_transparents*=s*1;/','$page_menu_transparent = 0;',$new_update);
$new_update = preg_replace('/$grandtour_page_menu_transparents*=s*1;/','$grandtour_page_menu_transparent = 0;',$new_update);
if(file_put_contents ($file, $new_update)){
echo '</br><span style="color:green;font-weight:bold;">Changes were applied successfully.</span>';
}else{
echo '</br><span style="color:red;font-weight:bold;">Error occured while applying the changes.</span>';
}
}
update_GTour_theme_files(__DIR__ . "/../../themes/grandtour/header.php");
Это обновит только один файл, чтобы сделать больше, чем вам нужно использовать scandir
, glob
или SPL DirectoryIterator / FilesystemIterator
.
PS ваша «главная» или «большая» проблема (помимо рекурсии) прямо здесь:
$new_update = preg_replace('/$page_menu_transparent = 1/','$page_menu_transparent = 0',$new_update);
$new_update = preg_replace('/$grandtour_page_menu_transparent = 1/','$grandtour_page_menu_transparent = 0',$new_update);
Эти $
в /$page_menu_transparent
не экранируются, поэтому обрабатываются как РЕГУЛЯРНОЕ выражение. Это означает, что они соответствуют концу строки, что не имеет смысла. Я также добавил немного допустимого пробела s*=s*
, а ;
точка с запятой в противном случае $page_menu_transparent = 1345;
станет $page_menu_transparent = 0;
. Это может оказать некоторое влияние, если он находится в ()
или массиве и т.д. (что-нибудь без ;
)
Для всех файлов в данной папке и ее вложенных папках
function update_GTour_theme_files($dir)
{
if (!file_dir($dir) || is_writable ($dir) ) die("Dir $dir Does not exists or is not writable");
$Iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator(
$dir,
RecursiveDirectoryIterator::SKIP_DOTS|RecursiveDirectoryIterator::UNIX_PATHS
)
);
foreach($Iterator as $fileInfo){
if($fileInfo->isDir() || $fileInfo->getExtension() != 'php') continue;
$file = $fileInfo->getPathname();
$new_update = file_get_contents($file);
$new_update = preg_replace('/$page_menu_transparents*=s*1;/','$page_menu_transparent = 0;',$new_update);
$new_update = preg_replace('/$grandtour_page_menu_transparents*=s*1;/','$grandtour_page_menu_transparent = 0;',$new_update);
if(file_put_contents ($file, $new_update)){
echo '</br><span style="color:green;font-weight:bold;">Changes were applied successfully.</span>';
}else{
echo '</br><span style="color:red;font-weight:bold;">Error occured while applying the changes.</span>';
}
}
}
update_GTour_theme_files(__DIR__ . "/../../themes/grandtour/");
Это использует RecursiveDirectoryIterator
, поэтому он должен просматривать все вложенные папки.
Но все это непроверено, поэтому будьте очень осторожны. Если вы испортите свои файлы, не обвиняйте меня, вы были предупреждены.
Тем не менее, наслаждайтесь ~