以编程方式在Wordpress中编辑PHP文件

时间:2019-03-22 23:18:34

标签: 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") && 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 个答案:

答案 0 :(得分:0)

我从哪里开始...让我数一数。

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") && 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") && 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_transparent\s*=\s*1;/','$page_menu_transparent = 0;',$new_update);
    $new_update = preg_replace('/\$grandtour_page_menu_transparent\s*=\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");

这只会更新一个文件,然后执行更多操作,您需要使用scandirglob或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不会被转义,因此将它们视为REGEX。这意味着它们与字符串的末尾匹配,这没有任何意义。我还添加了一些可用空间\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_transparent\s*=\s*1;/','$page_menu_transparent = 0;',$new_update);
        $new_update = preg_replace('/\$grandtour_page_menu_transparent\s*=\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,因此它应该浏览所有子文件夹。

但这是所有未经测试的,请非常小心。如果您弄乱文件不要怪我,那么您会被警告。

说享受〜