我遇到一个问题,我调用PHP函数的方式导致一个类的错误输出,否则行为正常。
具体来说,我使用full-name-parser包将全名分成“第一”,“中间”和“最后”部分。它准确地performs this task。
但是,我试图在WordPress中进行 - 特别是在通过WPAllImport插件导入时,我将CSV数据导入为WordPress用户。
WPAllImport支持在导入输入数据上执行PHP函数(标准或自定义),允许在保存之前对其进行操作,例如。 [function_name({input_field[1]})]
。
所以我制作了一个包装函数get_name_part
,允许我将输入字段name_full
分成第一个,中间名和姓,以便导入到相应的WordPress字段。我的get_name_part
看起来像这样......
require_once '/home/mysite/public_html/wp-content/plugins/cxt-user-wpai-import/full-name-parser/vendor/autoload.php';
use ADCI\FullNameParser\Parser;
// name eg. Jokubas Phillip Gardner
// part eg. title, first, middle, last, nick, suffix,
// called via eg. [get_name_part({name_full[1]}, "first")]
function get_name_part($name, $part) {
$parser = new Parser(
[
'part' => $part,
// 'fix_case' => FALSE,
'throws' => FALSE
]
);
// Return the parsed name part
$nameObject = $parser->parse($name);
// Give it back to WPAllImport
return $nameObject;
}
也就是说,它应该采用源名称name_full
以及对应于描述名称部分(first
,middle
或last
)的全名解析器选项的字符串。
在WPAllImport中,我在WPAllImport字段中分别调用这三行,用于first_name,last_name和我的自定义name_mid ...
[get_name_part({name_full[1]}, "first")]
[get_name_part({name_full[1]}, "middle")]
[get_name_part({name_full[1]}, "last")]
从理论上讲,这应该允许我使用单个包装函数从指定的全名中吐出指定的部分。
问题是...
[get_name_part({name_full[1]}, "first")]
放入我的导入设置'first_name字段中成功地将解析后的名字(例如“Jokubas”)保存在first_name WordPress字段中。[get_name_part({name_full[1]}, "last")]
在last_name字段中根本没有放置任何名称。它一再失败。[get_name_part({name_full[1]}, "middle")]
将实际中间和最后一个(例如“Phillip Gardner”)的错误组合作为中间名。所以实际输出是:
这与全名解析器本身不一致,它在我的函数和导入环境之外正确解析,如...
我不确定原因是什么,但我觉得这可能与从相同的导入步骤调用相同的函数三次有关,尽管参数不同。
我很欣赏我已经提到过几个不是普通PHP的产品名称。但我觉得我可以在功能代码中做些什么来容纳这个函数在一个进程中被调用三次,使用不同的参数;潜在的原因可能与这种重复或污染有关。
因此,我考虑是否需要在函数末尾销毁所有变量。然而,在unset
之后执行$name
,$part
,$parser
或$nameObject
上的return
并没有解决任何问题。
我错过了什么?
谢谢。
编辑:
WordPress debug.log显示:
[01-Mar-2018 15:43:06 UTC] WordPress database error Table 'context_wpdb.wpcxt_2_usermeta' doesn't exist for query SHOW COLUMNS FROM wpcxt_2_usermeta made by do_action('admin_init'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, PMXI_Plugin->adminInit, PMXI_Admin_Manage->edit, PMXI_Admin_Import->template, PMXI_Model->setTable
[01-Mar-2018 15:43:06 UTC] WordPress database error Table 'context_wpdb.wpcxt_2_usermeta' doesn't exist for query SELECT umeta_id, meta_key FROM wpcxt_2_usermeta GROUP BY meta_key ORDER BY umeta_id made by do_action('admin_init'), WP_Hook->do_action, WP_Hook->apply_filters, call_user_func_array, PMXI_Plugin->adminInit, PMXI_Admin_Manage->edit, PMXI_Admin_Import->template, PMXI_Model_List->getBy
PMXI *前缀与WPAllImport有关。
编辑2:
以下是全名解析器自行运行的一些有效方法(即将提供的全名切片到已识别的组件中)......
1.
将“part”作为“all”传递(或不传递,因为“all”是默认值)使$ nameObject成为包含所有已识别部分名称的对象...
require_once '/home/context/public_html/wp-content/plugins/cxt-user-wpai-import/full-name-parser/vendor/autoload.php';
use ADCI\FullNameParser\Parser;
$parser = new Parser(
[
'part' => 'all',
// 'fix_case' => FALSE,
'throws' => FALSE
]
);
$name = 'Jokubas Phillip Gardner';
$nameObject = $parser->parse($name);
print_r($nameObject);
...所以上面输出名称的所有可用部分......
FullNameParser\Name Object ( [leadingInitial:ADCI\FullNameParser\Name:private] => [firstName:ADCI\FullNameParser\Name:private] => Jokūbas [nicknames:ADCI\FullNameParser\Name:private] => [middleName:ADCI\FullNameParser\Name:private] => Phillip [lastName:ADCI\FullNameParser\Name:private] => Gardner [academicTitle:ADCI\FullNameParser\Name:private] => [suffix:ADCI\FullNameParser\Name:private] => [errors:ADCI\FullNameParser\Name:private] => Array ( ) )
这是正确的行为。
2.
但只传递名称的一部分,例如。 'part'作为'last',如下所示,使$ nameObject成为一个字符串,只包含一个声明的部分。所以...
require_once '/home/context/public_html/wp-content/plugins/cxt-user-wpai-import/full-name-parser/vendor/autoload.php';
use ADCI\FullNameParser\Parser;
$parser = new Parser(
[
'part' => 'last',
// 'fix_case' => FALSE,
'throws' => FALSE
]
);
$name = 'Jokubas Phillip Gardner';
$nameObject = $parser->parse($name);
echo 'Here is my nameObject: ' . $nameObject . '<br />';
以上仅输出以下内容......
Gardner
这也是正确的行为。
3.
全名解析器命名为get*
函数,专门用于获取单个部分,例如。 getFirstName()
,但它们似乎并不重要。我试图改用part
参数。
好吧,第一次尝试是错误的,但我想我发现了问题。
如果名称末尾有空格,则会发生此行为。实际上,解析器在这种情况下找不到姓氏,并抛出异常,但您已关闭异常。
如果你试试
$parser = new ADCI\FullNameParser\Parser(['throws' => FALSE]);
var_dump($parser->parse('Jokubas Phillip Gardner '));
你会看见:
class ADCI\FullNameParser\Name#2 (8) {
private $leadingInitial =>
NULL
private $firstName =>
string(7) "Jokubas"
private $nicknames =>
NULL
private $middleName =>
string(15) "Phillip Gardner"
private $lastName =>
NULL
private $academicTitle =>
NULL
private $suffix =>
NULL
private $errors =>
array(1) {
[0] =>
string(26) "Couldn't find a last name."
}
}
所以解决方案是trim
你的输入。
function get_name_part($name, $part) {
$parser = new Parser(
[
'part' => $part,
// 'fix_case' => FALSE,
// 'throws' => FALSE
]
);
// Return the parsed name part
return $parser->parse(trim($name));
}
'context_wpdb.wpcxt_2_usermeta'不存在。
错误消息中显而易见的是缺少表或者它在错误的模式中。
如何影响以及如果与您的问题有关,很难知道。
为了帮助你解决问题,这里有一个插件,我从前一段时间的某个页面。
这个插件可以让你在你的代码中添加日志语句,这些语句将出现在qazxsw poi文件中。
通过这种方式,您可以检查所调用函数的不同值,并查看可能出错的值。
要使插件正常工作,您必须在wp config.php中设置以下内容:
wp-content/debug.log
安装插件后,只需在代码中添加define('WP_DEBUG', true);
define('WP_DEBUG_DISPLAY', false);
define('WP_DEBUG_LOG', true);
即可在write_log($variable);
文件中输出。
/* 插入 */
debug.log
该插件应该独立放在if(!defined('ABSPATH')) exit;
if ( ! function_exists('write_log')) {
function write_log ( $log ) {
if (defined('WP_DEBUG_LOG') && true === WP_DEBUG_LOG){
if ( is_array( $log ) || is_object( $log ) ) {
error_log( print_r( $log, true ) );
} else {
error_log( $log );
}
}
}
}
文件夹中。
完成后,从代码中删除wp-content/plugins
语句,删除插件,并关闭write_log()
中的调试设置