我或多或少都是php的新手。我的目标是从登录用户的购物车中获取项目的名称,并使用该信息动态填充GravityForms模板。我已经成功地使用下面的代码做到了这一点,但有三件事我没有做到。 1:我只想使用某些变体的所有项目填充表单。 2: echo 功能会列出所有项目名称,但不会列在相关字段中,并且返回功能将填充该字段,但仅限于第一个项目名称。 3:我希望在每个项目名称之间使用某种形式的分隔符列出输出项目。这是我到目前为止所做的:
<?php
add_filter( 'gform_field_value_beat_names', 'beat_names_function' );
function beat_names_function( $value ) {
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach ($items as $item) {
$product_variation_id = $item['variation_id'];
$license_id = new WC_Product($product_variation_id);
$license_string = $license_id->get_formatted_name();
$beat_id = $item['data']->post;
$beat_name = $beat_id->post_title;
if (strpos($license_string, 'basic') !== false) {
echo $beat_name;
}
}
}?>
正如您所看到的,我正在尝试使用 strpos 来隔离我想要定位的特定项目变体,使用在变体选项名称中找到的特定单词,即“基本” 。我确信有一种更安全的方式,但它现在有效。问题在于我在条件strpos语句中设置的返回函数,因为它仍然只返回整个购物车项目列表,而不是只有我试图用strpos条件隔离的项目。
最终目标是创建一个动态填充相关信息的许可协议,包括许可项目的名称。项目变体是我可用于商店中产品的不同许可证选项。上述代码的目的是按许可证类型过滤购物车项目,以便在结帐时错误的项目名称不会列在错误的许可协议上。
任何提示都将不胜感激
答案 0 :(得分:0)
经过一些修修补补后想出来。我一步一步地把它分解,以帮助任何人像我一样无能为力
add_filter( 'gform_field_value_basic_beat_names', 'basic_beat_names_function' );
function basic_beat_names_function( $value ) {
global $woocommerce;
$items = $woocommerce->cart->get_cart();
// the item names you want will be stored in this array
$license_check = array();
// Loop through cart items
foreach ($items as $item) {
// get the id number of each product variation in the cart. this won't work for "simple" products
$product_variation_id = $item['variation_id'];
// translate that id number into a string containing the name of the product, and the options applied to the product
$license_id = new WC_Product($product_variation_id);
$license_string = $license_id->get_formatted_name();
// check to see if the word "basic" is found anywhere in that string. "basic" is contained in the name of the product option being targeted
if (strpos($license_string, 'basic') !== false) {
// if the above condition is met, fetch the name of any products in the cart that have that option applied. The product name will be fetched from the title of the product's page
$beat_id = $item['data']->post;
$beat_name = $beat_id->post_title;
// store the retrieved product names in the $license_check array
$license_check [] = $beat_name;
}
}
// pull the stored product names from the $license_check array, and format them using implode and concatenation, then return the final result to the form field
return "\"" . implode("\", \"", $license_check) . "\"";
}
作为警告, strpos 方法有点hacky。只有当你的字符串足够具体,只能定位你正在寻找的选项时,它才能正常工作。
举个例子,这里是产品变体字符串的格式被输入 strpos 函数:
item-name-option-one-name-option-two-name – variation #xxx of item page title
因此,如果您只想通过选项1过滤项目,那么您最安全的选择就是编写strpos函数,如下所示:
if (strpos($license_string, 'option-one-name') !== false) {
//do something
}
完成所有操作后,最终结果应如下所示:“item1”,“item2”,“item3”等
然后,要对任何其他选项执行相同操作,并将结果输出到不同的字段或完全单独的表单,我将只复制此代码,并将“basic”一词的任何提及替换为一些不同的唯一包含在另一个选项中的字符串。不要忘记根据需要配置重力表格字段。