我已经搜索了高低的互联网,寻找在某些网页上有条件地显示WooCommerce产品属性数据的方法。
例如:如果属性somethingcool有一个值且它在/?filtering = 1& filter_manufacturer = 1648页面上,则显示值
如果某个属性位于特定的已过滤页面上,我希望以不同方式显示该属性
例: http://www.colorselectcoil.com/color-match-tool/?filtering=1&filter_manufacturer=1648
根据此过滤页面,显示产品属性' somethingcool'
<?php if ( is_product_attribute('somethingcool') ) {
echo 'Hi! This is something cool?';}
else {
echo '';
}
?>
如果它是一个普通的WordPress页面,而不是一个过滤的页面,我可以隐藏和显示基于body类标记,但不幸的是,body类没有根据查询字符串URL进行更改。
答案 0 :(得分:3)
您可以使用网址搜索字符串并从中提取您想要的任何部分。例如,如果您只想知道自己是否在过滤页面上,那么您就不用费心去检查制造商了。
<?php if ( $product->get_attribute('Certainteed') && intval($_GET['filtered']) == 1 && intval($_GET['filter_manufacturer']) == 1648 ) {
echo 'Hi! This is something cool?';
}
?>
intval()
位应该足以防止注入。
如果您想找到uri的一部分,可以使用以下内容:
if( stristr( htmlspecialchars($_SERVER['REQUEST_URI']), 'color-match-tool') && is_product_attribute('somethingcool') ){
echo 'Hi! This is something cool!';
}
检查您的示例返回的echo is_product_attribute('Everlast');
。
$_GET...
通过名称获取搜索字符串中的变量,这些变量位于方括号中。
<?php if( stristr( htmlspecialchars($_SERVER['REQUEST_URI']), 'color-match-tool') && intval($_GET['filtering']) == 1 && intval($_GET['filter_manufacturer']) == 1694 && is_product_attribute('Everlast') ){
echo 'Hi! This is something cool!';
} ?>
一次尝试只使用一件物品,然后积累起来就可以了解它。
加载有关在字符串How do I check if a string contains a specific word in PHP?
中查找字符串的信息如果需要,可以获取和回显产品属性的其他方法: Woocommerce getting custom attributes
我不确定这是否有用,但它可能足够适应。
您可以传递过滤器值$ff
您想要的过滤器整数值$ffv
(可能与1不同)$fm
是$filter_manufacturer
整数值{{1} } - 是您正在寻找的价值 - 就像您的示例1648那样,产品数组$fmv
,您的$product
变量和$collection
是文本中的“我想要的属性”表单,但您也可以将其传递给变量。
将此功能放入$aiw
functions.php
并通过传递给它的这一小部分来调用它
function attribute_i_want( $ff,$ffv, $fm, $fmv, $prod, $coll, $aiw){
if( $ff == 1 && $fm == $fmv && $collection = $prod->get_attribute($aiw) ){
echo '<div class="attribute-titles">. $aiw . ' name: ';
echo ($coll = $prod->get_attribute($aiw) ) ? $collection : __('', 'woocommerce'); echo '</div>';
}
}
add_action( 'wp_enqueue_scripts', 'attribute_i_want' );
我假设您发布的代码正常运行。
查看您的页面我无法看到它是如何从下拉列表中获取值的,因为它没有名称或ID - 理想情况下在onchange事件 <?php attribute_i_want( intval($_GET['filtering']), 1, intval($_GET['filter_manufacturer']), 1648, $product, $coll, 'Certainteed'); ?>
中 - 我也找不到但是相信它是一个事件列表器脚本 - 你可以使用这样的东西设置一个隐藏变量来获取下拉文本值,并将其用于函数调用中的插槽,你当前必须手动输入文本,如'Certainteed'在示例中:
onchange="setManufacturer()";
这将获得从select下拉列表中选择的内容的文本 - 这将需要ID“manufacturerName”并将该文本值插入隐藏输入的值,PHP将能够在PHP函数中拾取和使用呼叫。
onchange事件将触发JavaScript并提交页面,php将从隐藏的输入中获取文本值,这将被放入函数调用中:
<script language=JavaScript>
function setManufacturer(){
var manufacturerName = manufacturerDropdown.options[manufacturerName.selectedIndex].innerHTML;
documentGetElementById('submittedManufacturerName').value = manufacturerName;
}
</script>
<input type="hidden" id ="submittedManufacturerName" name="submittedManufacturerName" value = "" />
除非有任何其他方法,您可以在PHP变量中获取制造商名称的值 - 这可能是因为制造商名称确实出现在您的下拉列表上方链接页面的其他位置,因此它可能已经存在作为PHP变量,您可以使用它。这样,您的功能将完全自动化,而无需额外的JavaScript。该值显示在现有页面上名为“删除过滤器”的 <?php attribute_i_want( intval($_GET['filtering']), 1, intval($_GET['filter_manufacturer']), $manufacturerName, $product, $coll, $submittedManufacturerName); ?>
中。
a href
将是从$manufacturerName
收集的下拉列表实际值中提交的值
答案 1 :(得分:1)
<?php if( intval($_GET['filtering']) == 1 && intval($_GET['filter_manufacturer']) == 1648 && $collection == $product->get_attribute('Certainteed') ){ echo '<div class="attribute-titles">Certainteed name: '; echo ($collection == $product->get_attribute('Certainteed') ) ? $collection : __('', 'woocommerce'); echo '</div>'; } ?>