Редактировать PHP-файл в WordPress программно

#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 , поэтому он должен просматривать все вложенные папки.

Но все это непроверено, поэтому будьте очень осторожны. Если вы испортите свои файлы, не обвиняйте меня, вы были предупреждены.

Тем не менее, наслаждайтесь ~