我遇到的问题是我调用PHP函数的方式导致一个类的输出不正确,否则会正常运行。
具体来说,我使用full-name-parser包将全名拆分为“first”,“middle”和“last”部分。它准确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
或{{ 1}})。
在WPAllImport中,我在WPAllImport字段中分别调用这三行,用于first_name,last_name和我的自定义name_mid ...
last
理论上,这应该允许我使用单个包装函数从指定的全名中吐出指定的部分。
问题是......
第一个操作成功完成。也就是说,将[get_name_part({name_full[1]}, "first")]
[get_name_part({name_full[1]}, "middle")]
[get_name_part({name_full[1]}, "last")]
放入我的导入设置'first_name字段成功地将解析后的名字(例如“Jokubas”)保存在first_name WordPress字段中。
然而,事情发生后就崩溃了。 [get_name_part({name_full[1]}, "first")]
在last_name字段中根本没有放置任何名称。它一再失败。
[get_name_part({name_full[1]}, "last")]
将实际中间和最后一个(例如“Phillip Gardner”)的错误组合作为中间名。
所以实际输出是:
这与全名解析器本身不一致,后者在我的函数和导入环境之外正确解析,如...
我不确定原因是什么,但我觉得这可能与从同一个导入步骤调用相同的函数三次有关,虽然参数不同。
我很欣赏我之前提到过几个不是普通PHP的产品名称。但我觉得我可以在功能代码中做些什么来容纳这个函数在一个进程中被调用三次,使用不同的参数;潜在的原因可能与这种重复或污染有关。
因此,我考虑是否需要在函数末尾销毁所有变量。但是,在[get_name_part({name_full[1]}, "middle")]
之后unset
,$name
,$part
或$parser
执行$nameObject
无法解决问题。
我错过了什么?
感谢。
修改
WordPress debug.log显示:
return
PMXI *前缀属于WPAllImport。
编辑2 :
以下是全名解析器自行运行的一些有效方法(即将提供的全名切片到已识别的组件中)...
1
将“part”作为“all”传递(或不传递,因为“all”是默认值)使$ nameObject成为对象,其中包含所有已识别的名称部分......
[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
...所以上面输出名称的所有可用部分......
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);
这是正确的行为。
2
但只传递名称的一部分,例如。 'part'为'last',如下所示,使$ nameObject为 string ,仅包含一个声明的部分。所以......
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 ( ) )
以上仅输出以下内容......
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 />';
这也是正确的行为。
3
全名解析器命名Gardner
函数专用于获取单个部分,例如。 get*
,但它们似乎并不重要。我试图改为使用getFirstName()
参数。
答案 0 :(得分:1)
好的,第一次尝试是错误的,但我认为我发现了问题。
如果名称末尾有空格,则会发生此行为。实际上解析器在这种情况下找不到姓氏,并抛出异常,但你已经关闭异常。
如果您尝试
$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));
}
答案 1 :(得分:0)
'context_wpdb.wpcxt_2_usermeta'不存在。
错误消息中的obviuos是缺少一个表或者它是错误的模式。
这会如何影响,如果与您的问题有关,则很难知道。
为了帮助您解决这个问题,我在前一段时间从一些页面中获取了一个插件。
此插件允许您将日志状态添加到代码中,该代码将出现在wp-content/debug.log
文件中。
通过这种方式,您可以检查您正在调用的函数的不同值,并查看可能出现的错误。
要使插件正常工作,您必须在wp_config.php中设置以下内容:
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()
语句,删除插件,然后关闭wp_config.php