Использование WP_Filesystem в блоке кода

То, что я пытаюсь сделать, состоит в том, чтобы эта функция работала в моем блоке плагинов кода, не имея его как плагина на нем.

Мое текущее и рабочее решение вне WordPress

Сохранить содержимое

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

Получение данных

 $dataHolder="keepdata.txt"; $dataPool=file($dataHolder); $TextPool=explode("||", (string)$dataPool[0]); if ($dataPool) { $ContactName=$TextPool[0]; $ContactPhone = $TextPool[1]; } 

Вывод // ContactName // ContactPhone

Логика полностью распечатает все требуемые данные.

Однако делать то же самое в WordPress порождает ошибки или даже не повторяет данные.

Я столкнулся с рекомендуемыми решениями, которые предлагали использовать WP_Filesystem. С этого сайта я попробовал, в котором он отлично работает как автономный плагин. Но это не то решение, которое я хочу.

Мне бы хотелось, чтобы wp_filesystem, как это, без admin_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(){} ниже

 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> 

Я делаю это так, но не повезло. Спасибо

Solutions Collecting From Web of "Использование WP_Filesystem в блоке кода"

Чтение и запись в файл будет рискованным. Вы будете бороться с правами доступа к файлам, если вы сохраните где-нибудь, кроме каталога wp-content/uploads (и похоже, что вы хотите сохранить его в каталоге плагинов). Если у вас есть достаточный контроль над сервером, вы можете заставить его работать, отредактировав разрешения в каталоге плагинов, но я бы этого не сделал . Это создает потенциальные проблемы безопасности. Во всяком случае, требуя, чтобы разрешения на доступ к каталогам были отредактированы, ваш код будет очень не переносимым.

  1. Вы можете сохранить свой файл в wp-content/uploads но он может быть доступен для отслеживания.
  2. Вы можете использовать WP_Filesystem но вам нужно скорее всего получить request_filesystem_credentials() . Я не знаю, что вы подразумеваете, используя его без admin_menu() но я думаю, что вы имеете в виду без диалога. Если я правильно помню, если вы жестко задаете учетные данные в wp-config.php вы не получите всплывающий диалог . Возможно, вам потребуются пользователи для редактирования файлов, что делает ваш код менее портативным.
  3. Лучший вариант для меня – просто не пытаться манипулировать данными в файл и из него. Сохраните свои данные как пользовательские мета в базе данных.