【问题标题】:WooCommerce: How to check if meta key exists for a specific productWooCommerce:如何检查特定产品的元密钥是否存在
【发布时间】:2019-12-30 04:20:22
【问题描述】:

情况:修改产品模板以仅在特定产品元数据存在/已设置/大于零时显示某些 HTML(它是一种附加价格类型,它将为空或正整数)。

实际的元是 WooCommerce 的“MSRP 价格”的助推器,它是作为元字段添加的。

所以这行得通:echo do_shortcode( '[wcj_product_meta name="_wcj_msrp"]' );

但我只想在相关产品确实设置了建议零售价时展示它(并非商店中的所有产品都会)。对此的测试可以是“非空”、“已设置”或“大于零”。

尝试以下语法:

<?php if ($product ->metadata_exists(_wcj_msrp)) {
    echo '<li class="single-product-price price-msrp">MSRP: <span>$</span>';
    echo do_shortcode( '[wcj_product_meta name="_wcj_msrp"]' );
    echo '</li>';
  }
?>

结果:页面无休止地加载。

我错过了什么简单的愚蠢的事情?

【问题讨论】:

    标签: php wordpress function methods woocommerce


    【解决方案1】:

    想通了。感谢 LoicTheAztec,让我走上了正确的道路! :)

    <?php $msrp = get_post_meta( get_the_ID(), '_wcj_msrp', true );
      if ($msrp == '') {
        echo '';
      } else {
        echo '<li class="single-product-price price-msrp">MSRP: <span>$ ';
        echo do_shortcode( '[wcj_product_meta name="_wcj_msrp"]' );
        echo '</span></li>';
      }
    ?>
    

    经过测试,可以正常使用。如果 MSRP 字段中有值,则输出 LI 及其正确的内容。如果 MSRP 字段为空,则不输出任何内容。

    这里的人生教训是:不要检查元数据字段是否存在,因为无论如何它都可能存在。检查是否为空。

    已回答,已关闭,谢谢!

    【讨论】:

      【解决方案2】:

      第一个 metadata_exist() 是 WordPress 条件函数,但不是 WC_Product 方法(或继承的 WC_Data 方法)。这就是您的代码不起作用的原因,因为您没有以正确的方式使用 metadata_exist(),因为该函数需要 3 个参数并且不能用作 WC_Product 对象上的方法。

      假设您的简码可以正常工作,并且 WC_Product 对象已定义并可访问。 您有 2 种可能性检查产品是否存在元键(位于 wp_postmeta 表中)

      1) 以这种方式使用 WooCommerce WC_Data meta_exist() (conditional) 方法:

      <?php if ( $product->meta_exists( '_wcj_msrp' ) ) {
          echo '<li class="single-product-price price-msrp">MSRP: <span>$</span>';
          echo do_shortcode( '[wcj_product_meta name="_wcj_msrp"]' );
          echo '</li>';
      } ?>
      

      2) 这样使用metadata_exist() WordPress 条件函数:

      <?php if ( metadata_exists( 'post', $product->get_id(), '_wcj_msrp' ) ) {
          echo '<li class="single-product-price price-msrp">MSRP: <span>$</span>';
          echo do_shortcode( '[wcj_product_meta name="_wcj_msrp"]' );
          echo '</li>';
      } ?>
      

      两者都应该工作。

      【讨论】:

      • 选项 1 不起作用 - 即使没有 MSRP,它仍会输出“MSRP: $”;这正是我想要避免的。 Aaannnnd 选项 2 也不起作用。嗯。也许我的假设是错误的,并且检查元数据字段的存在是一个坏主意 - 我应该检查该字段是否实际上是空的。
      • @TomJones999 我已经使用了他们两个并且它们工作正常......在你的情况下,没有人可以为你测试,看看有什么问题。我的回答只是告诉你代码中与metadata_exists() 相关的错误是什么……
      【解决方案3】:

      我对 wordpress 了解不多,但我看了一下,发现 metadata_exists 需要元类型、对象 ID 和元键。也许你应该在 $product ->metadata_exists() 上检查你的实现。

      【讨论】:

        猜你喜欢
        • 2018-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多