如何从WordPress HivePress复选框字符串提取独立变量
问题:HivePress社交APP选择结果变量匹配错位
我使用WordPress和HivePress插件搭建广告目录,用户可在表单中选择用于联系的APP——social_apps字段下设有Telegram、Viber、WhatsApp三个复选框。通过代码$apps = $listing->display_social_apps();可获取用户选择结果,返回值为逗号分隔的字符串(例如仅选Viber和WhatsApp时返回“Viber, WhatsApp”,全选时返回“Telegram, Viber, WhatsApp”)。
尝试用explode拆分字符串并赋值给三个独立变量,但仅当用户全选三个复选框时变量对应正确;若仅选择部分APP(如Viber和WhatsApp),变量会出现错位(如$telegram变量会输出Viber)。需要让每个变量始终对应正确的APP(如$viber仅在用户选择Viber时输出Viber)。
原代码如下:
add_filter( 'hivepress/v1/templates/listing_view_page/blocks', function( $blocks, $template ) { $listing = $template->get_context('listing'); if(!$listing){ return $blocks; } $apps = $listing->display_social_apps(); $results = explode(',', $apps); $telegram = $results[0]; $viber = $results[1]; $whatsapp = $results[2]; return hivepress()->template->merge_blocks( $blocks, [ 'page_sidebar' => [ 'blocks' => [ 'custom_text_apps' => [ 'type' => 'content', 'content' => '<p><strong>'.$telegram.' and '.$viber.' and '.$whatsapp.'</strong></p>', '_order' => 12, ], ], ], ] ); }, 1000, 2 );
表单字段代码:
<div class="hp-form__field hp-form__field--checkboxes"><label class="hp-field__label hp-form__label"><span>Apps</span> <small>(optional)</small></label><div class="hp-field__description">Select the apps you can be contacted on.</div><div class="hp-field hp-field--checkboxes"><ul><li><label for="social_apps_6475ffa0ec27c" class="hp-field hp-field--checkbox"><input type="checkbox" name="social_apps[]" id="social_apps_6475ffa0ec27c" value="46" ><span>Telegram</span></label></li><li><label for="social_apps_6475ffa0ec377" class="hp-field hp-field--checkbox"><input type="checkbox" name="social_apps[]" id="social_apps_6475ffa0ec377" value="45" checked='checked' ><span>Viber</span></label></li><li><label for="social_apps_6475ffa0ec46f" class="hp-field hp-field--checkbox"><input type="checkbox" name="social_apps[]" id="social_apps_6475ffa0ec46f" value="35" checked='checked' ><span>WhatsApp</span></label></li></ul></div></div>
解决方法
核心思路是不依赖数组索引赋值,而是先把返回的字符串处理成干净的APP名称数组,再逐个判断每个APP是否存在于数组中,确保变量与APP一一对应。
修改后的代码:
add_filter( 'hivepress/v1/templates/listing_view_page/blocks', function( $blocks, $template ) { $listing = $template->get_context('listing'); if(!$listing){ return $blocks; } $apps = $listing->display_social_apps(); // 处理字符串:拆分、去空白、过滤空元素 $selected_apps = array_filter(array_map('trim', explode(',', $apps))); // 逐个判断APP是否被选中,赋值对应名称或空字符串 $telegram = in_array('Telegram', $selected_apps) ? 'Telegram' : ''; $viber = in_array('Viber', $selected_apps) ? 'Viber' : ''; $whatsapp = in_array('WhatsApp', $selected_apps) ? 'WhatsApp' : ''; // 收集非空的APP名称,避免多余的"and" $display_apps = array_filter([$telegram, $viber, $whatsapp]); $display_text = !empty($display_apps) ? implode(' and ', $display_apps) : 'No contact apps selected'; return hivepress()->template->merge_blocks( $blocks, [ 'page_sidebar' => [ 'blocks' => [ 'custom_text_apps' => [ 'type' => 'content', 'content' => '<p><strong>'.$display_text.'</strong></p>', '_order' => 12, ], ], ], ] ); }, 1000, 2 );
关键说明
- 字符串处理:用
array_map('trim', ...)去掉每个APP名称前后的空格,再用array_filter过滤掉拆分后可能出现的空元素(比如用户全不选时,explode会得到一个包含空字符串的数组)。 - 精准匹配:通过
in_array判断每个预设的APP名称是否在选中列表里,确保变量只在对应APP被选中时才赋值。 - 友好输出:收集非空的APP名称,用
implode拼接成自然的文本,避免出现类似“ and and WhatsApp”的错误格式,同时处理了用户未选任何APP的情况。
内容的提问来源于stack exchange,提问作者Instig
相关产品推荐
相关产品推荐

