我是WordPress插件api、php和ajax的初学者。我正在为自己编写一个培训插件,将文章保存起来,以便以后阅读,就像web浏览器上的收藏夹一样,带有文件夹。
我使用oop来实现这一点。
我假设创建一个名为“favoris”的新用户元,它是一个包含用户创建的文件夹的数组。
我有这样的东西来获取FAV、创建文件夹和删除它们。
/**
* Get favorites
*/
public function fp_ajax_getFav(){
$current_user = wp_get_current_user();
$userid = $current_user->ID;
$folder = get_user_meta($userid, \'favoris\');
$content = \'\';
$content .= \'Favoris\';
$content .= \'\';
$content .= \'\';
$content .= \'\';
$content .= \'\';
if (!empty($folder)) {
$content .= \'Tout supprimer\';
$content .= \'Aucun favoris.\';
}
else{
$content .= \'Tout supprimer\';
$content .= \'Aucun favoris.\';
}
$content .= \'\';
if (!empty($folder)) {
$msg = \'\';
foreach ($folder as $key) {
foreach ($key as $k => $value) {
$content .= \' \' . ucwords($value[\'titre\']) . \'\';
}
}
}
else{
}
$content .= \'\';
$content .= \'\';
return $content;
}
/**
* Add folder
*/
public function fp_ajax_addFolder(){
$current_user = wp_get_current_user();
$userid = $current_user->ID;
$meta = get_user_meta($userid, \'favoris\');
if (empty($meta)) {
if ($_REQUEST[\'foldername\'] !== \'\') {
$folder[0][\'titre\'] = $_REQUEST[\'foldername\'];
add_user_meta($userid, \'favoris\', $folder);
var_dump($folder);
echo ucwords($_REQUEST[\'foldername\']);
die();
}
}
if (!empty($meta)) {
$folder = $meta[0];
if ($_REQUEST[\'foldername\'] != \'\') {
foreach ($folder as $key => $value) {
$i = count($folder);
if ($value[\'titre\'] != $_REQUEST[\'foldername\']) {
$folder[$i][\'titre\'] = $_REQUEST[\'foldername\'];
update_user_meta($userid, \'favoris\', $folder);
var_dump($folder);
echo ucwords($_REQUEST[\'foldername\']);
die();
}
}
}
}
}
/**
* Remove folder
*/
public function fp_ajax_removeFolder(){
if ( ( !isset($_POST[\'folderId\']) || empty($_POST[\'folderId\']) ) && ( !isset($_POST[\'folderName\']) || empty($_POST[\'folderName\']) ) ) {
echo \'Pas de dossier spécifié\';
die();
}
else{
$id = $_POST[\'folderId\'];
$name = $_POST[\'folderName\'];
$current_user = wp_get_current_user();
$userid = $current_user->ID;
$folder = get_user_meta($userid, \'favoris\');
$folderToErase = $folder[0][$id];
try {
delete_user_meta($userid, \'favoris\', $folder[0][$id]);
echo $folderToErase[\'titre\'];
//print_r($folder[0][$id][\'titre\']);
}
catch (Exception $e) {
echo \'not ok\';
var_dump($folder);
return $e->getMessage();
}
die();
}
}
就我所得到或创造的而言,一切都很顺利。但当我想按键($id)删除文件夹时,它不会删除。但当我回显$folderToErase时,id是正确的。
也许能帮点忙?
最合适的回答,由SO网友:s_ha_dum 整理而成
根据问题注释,您的数据存储在数据库中的序列化数组中:
... it\'s stored as the api\'s working for. It looks like that in the database : `a:3:{i:0;a:1:{s:5:"titre";s:3:"sfg";}i:1;a:1:{s:5:"titre";s:4:"test";}i:2;a:1:{s:5:"titre";s:4:"test";}}`
您试图通过将密钥传递给
delete_user_meta()
. 不是这样的
delete_user_meta()
作品不会的
unserialize()
该值并移除阵列的单个部分。它将删除表中键和值完全匹配的行。那不是你想要的。对于序列化数据,最终得到的是一个需要自己处理的数组。
像这样的方法应该会奏效:
// $id = $_POST[\'folderId\'];
// fake $_POST[\'folderID\']
$id = \'test\';
$current_user = wp_get_current_user();
$userid = $current_user->ID;
// $folder = get_user_meta($userid, \'favoris\');
// fake the get_user_meta call
$folder = unserialize(\'a:3:{i:0;a:1:{s:5:"titre";s:3:"sfg";}i:1;a:1:{s:5:"titre";s:4:"test";}i:2;a:1:{s:5:"titre";s:4:"test";}}\');
try {
foreach ($folder as $k => $m) {
if ($m[\'titre\'] === $id) {
unset($folder[$k]);
}
}
update_user_meta($userid, \'favoris\', $folder);
}
catch (Exception $e) {
echo \'not ok\';
return $e->getMessage();
}
您需要做的是处理阵列,删除不需要的部分,然后重新保存它。
注意:当我开始写这段代码时,我意识到我不能百分之百确定您想要完成什么。你的一些$_POST
数据对我来说并不完全清楚。不过这应该会让你走上正轨。