WP_文件系统在代码块中的使用

时间:2015-06-22 作者:ShapCyber

我想做的是让这个函数在我的插件代码块中工作,而不是将其作为插件。

我目前在wordpress之外的工作解决方案是

Save contents

$KeepText="$name||$Phone||";
$dataHolder="keepdata.txt";
$file = fopen($dataHolder,"w");
if(fwrite($file, $KeepText)){echo "Data Saved Successfully !";}
else{echo "Error Occur !";}
fclose($file);
Retrieve data

$dataHolder="keepdata.txt";
$dataPool=file($dataHolder);
$TextPool=explode("||", (string)$dataPool[0]);

if ($dataPool) {
$ContactName=$TextPool[0];
$ContactPhone = $TextPool[1];
}
Output//联系人姓名//联系人电话

逻辑将完美地打印出所有必需的数据。

然而,在WordPress中执行同样的操作会产生错误,甚至不会回显数据。

我遇到了一些建议使用WP\\u文件系统的解决方案。From This Website我已经试过了,它作为一个独立的插件工作得很好。但这不是我想要的解决方案。

我想做的是让wp\\u文件系统像这样没有admin\\u menu()。

function filesystem_init($form_url, $method, $context, $fields = null) {
    global $wp_filesystem;

    if (false === ($creds = request_filesystem_credentials($form_url, $method, false, $context, $fields))) {

    return false;
        }

        if (!WP_Filesystem($creds)) {
        request_filesystem_credentials($form_url, $method, true, $context);
        return false;
        }
        return true; 
    }
然后有function dataTosave(){} 如下所示

function dataTosave($form_url){
    global $wp_filesystem;

    check_admin_referer(\'contact_form\');

    $contactname = sanitize_text_field($_POST[\'contactname\']); 
    $contactphone = sanitize_text_field($_POST[\'contactphone\']); 

    $form_fields = array(\'contactname\',\'contactphone\'); 

    $method = \'\'; 
    $context = WP_PLUGIN_DIR . \'/keepdata\'; 

    $form_url = wp_nonce_url($form_url, \'contact_form\'); 

    if(!filesystem_init($form_url, $method, $context, $form_fields))
        return false; 

    $target_dir = $wp_filesystem->find_folder($context);
    $target_file = trailingslashit($target_dir).\'/keepdata.txt\';


    $dataTosave=$contactname."||".$contactphone."||";
    if(!$wp_filesystem->put_contents($target_file, $dataTosave, FS_CHMOD_FILE)) 
        return new WP_Error(\'writing_error\', \'Error when writing file\');           

    return "Data Saved";
}
表单发布后

 if(isset($_POST[\'contactform_submit\'])){
dataTosave();
//new submission run the function
}

<form method="post" action="" >
<?php wp_nonce_field(\'contact_form\'); ?>
    <label for="contactname">Contact Name</label><br>
    <input id="contactname" name="contactname" value="<?php echo $_POST[\'contactname\']?>" require >
<label for="contactphone">Contact Phone</label><br>
    <input id="contactphone" name="contactphone" value="<?php echo $_POST[\'contactphone\']?>" required >



<?php submit_button(\'Submit\', \'primary\', \'contactform_submit\', true);?>

</form>
我曾经这样做过,但运气不好。谢谢

1 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

读取和写入文件将是危险的。如果您在除wp-content/uploads 目录(看起来您想保存到plugins目录)。如果您对服务器有足够的控制权,您可以通过在插件目录中编辑权限来实现这一点,但我不会这样做。它可能会带来安全问题。无论如何,要求编辑目录权限将使您的代码非常不可移植。

您可以将文件保存到wp-content/uploads 但它可能很容易被窥探WP_Filesystem 但你需要request_filesystem_credentials() 很可能正在工作。我不知道你用它是什么意思admin_menu() 但我想你的意思是没有对话。If I remember correctly, if you hardcode credentials in to wp-config.php you won\'t get the popup dialogue. 您可能需要用户编辑文件,这会降低代码的可移植性Save your data as user meta 在数据库中

结束

相关推荐

JQuery Plugins in Wordpress

我已经能够在某种程度上拼凑出应该如何做到这一点,但我真的很难做到这一点。我想使用Table Sorter插件(http://tablesorter.com) 在自定义页面模板中显示数据,但我不确定它是否正确。我已经钩住了“wp\\u enqueue\\u scripts”,并使用此函数将表分类器JS文件排入队列。我相信这是正确的,但是我还需要在JQuery Ready()函数中放置一行,但是我不确定如何从自定义页面模板中执行此操作。有人能解释一下吗?<?php /* Templat