我在帖子中有这个代码:
[quick_view product_id="10289" type="button" label="Quick View"]
我希望函数内部的数字“10289”匹配任何数字:
if (stripos($post-> post_content, '[quick_view product_id="XXXX" type="button" label="Quick View"]') !== false)
如何更换“XXXX”以接受所有号码?
完整代码段
function conditionally_add_scripts_and_styles($posts){
if (empty($posts)) return $posts;
$shortcode_found = false; // use this flag to see if styles and scripts need to be enqueued
foreach ($posts as $post) {
if (stripos($post-> post_content, '[quick_view product_id="XXXX" type="button" label="Quick View"]') !== false) {
$shortcode_found = true; // bingo!
break;
}
}
if ($shortcode_found) {
// enqueue here
wp_enqueue_style('my-style', '/woocommerce.css');
wp_enqueue_script('my-script', '/script.js');
}
return $posts;
}
谢谢。
答案 0 :(得分:10)
试试这个,希望它能正常工作。
正则表达式 /product_id\s*\=\s*\"\d+\"/
此正则表达式将查找product_id="
< - > "
示例:
product_id="xxAbcxx"
将被拒绝。
product_id="1212121"
将被接受。
if(preg_match("/product_id\s*\=\s*\"\d+\"/", $post->post_content))
{
echo "Accepted";
}
您的完整代码将如下所示。
function conditionally_add_scripts_and_styles($posts)
{
if (empty($posts))
return $posts;
$shortcode_found = false; // use this flag to see if styles and scripts need to be enqueued
foreach ($posts as $post)
{
if(preg_match("/product_id\s*\=\s*\"\d+\"/", $post->post_content))
{
$shortcode_found = true;
break;
}
}
if ($shortcode_found)
{
// enqueue here
wp_enqueue_style('my-style', '/woocommerce.css');
wp_enqueue_script('my-script', '/script.js');
}
return $posts;
}
答案 1 :(得分:1)
Sahil的回答包括不必要的代码位和次优的正则表达式模式。 为了获得最佳性能,这是读者应该使用的:
function conditionally_add_scripts_and_styles($posts){
foreach($posts as $post){
if(preg_match('/product_id="\d/',$post->post_content)){
wp_enqueue_style('my-style','/woocommerce.css');
wp_enqueue_script('my-script','/script.js');
break;
}
}
return $posts;
}
我的回答和Sahil的区别是什么?
empty()
循环之前的foreach()
条件是不必要的,因为如果数组为空,foreach将不会迭代一次。$shortcode_found
的每个声明/使用。=
,这是不必要的,并教导了一种不必要的习惯。product_id
的值是不必要的,因为如果只有一个数字,条件应正确返回true
结果。由于OP已指示产品ID在格式上是完全数字的,因此无需检查整个值。如果担心全部值,那么/product_id="\d+"/
就可以了。