【问题标题】:jQuery to PHP: Add a selector class to children elements if more than onejQuery to PHP:如果多个子元素添加一个选择器类
【发布时间】:2021-02-14 11:49:45
【问题描述】:

是否可以在PHP中实现与下面的jQuery代码相同的东西?

我用它来隐藏从批发商进口产品时出现的错误。

这是我使用的 jQuery 代码:

jQuery(document).ready(function( $ ){
    $('.woocommerce-product-details__short-description:has(p:nth-of-type(2)) p').addClass('ukryj-klase-krotki');
});

它是如何工作的:

jQuery 检查产品简短描述中是否有多个<p> 元素。如果还有更多 - 它将类 'ukryj-klase-krotki' 添加到所有 <p> 元素。然后我添加 CSS 类来隐藏产品简短描述中生成的第一个 <p> 元素,所以我想要的唯一一个是可见的:

CSS 代码:

.woocommerce-product-details__short-description .ukryj-klase-krotki{
    display: none;
}

.woocommerce-product-details__short-description .ukryj-klase-krotki ~ .ukryj-klase-krotki{
    display: block;
}

有什么帮助吗?

【问题讨论】:

  • “我用它来隐藏导入过程中出现的错误……”,为什么要隐藏错误而不是修复它们(不管它是什么)。 “是否可以在 PHP 中编写这样的 jQuery 代码?”,您不会回显需要您调整核心文件/扩展文件的错误。或者您打算将所有输出通过过滤器,然后使用正则表达式将其过滤掉?您也可以为此使用 CSS,不是吗? .woocommerce-product-details__short-description p + p(应该在 .woocommerce-product-details__short-description 中选择除第一个以外的所有其他 p)
  • @DefinitelynotRafal 在这种特殊情况下,隐藏错误更快,因为从仓库导入产品的过程是多阶段的并且需要很长时间(很多很多小时 - 25k+ 产品) .我没有广泛的 PHP 知识,无法很好地了解它的工作原理或编写脚本 - 因此我的问题是。我使用的解决方案并不适用于任何地方 - 例如,在产品的快速查看中,只有在按下“快速查看”按钮后才会加载(生成带有产品预览的弹出窗口)。我认为解决方案是 PHP。
  • 我向您提供了 2 个选项:要么您首先不 echo 错误(为此,您需要知道错误在哪里回显)。或者(我真的不推荐这个选项)您在某种函数中捕获所有输出并在之后将其过滤掉(因为您需要调整您的框架以使其通过您的函数,然后再将请求返回给您的客户端) .如果您需要使用 PHP,我不相信您还有其他选择。也许有 wordpress 经验的人可以为您提供更多帮助。
  • “在这种特殊情况下,隐藏错误更快......”,通常情况下是这样,它是一个借口,但最终你可能会遇到麻烦。因为你只是掩盖错误而不是修复它。

标签: php jquery wordpress templates woocommerce


【解决方案1】:

首先阅读Template structure & Overriding templates via a theme,了解如何通过活动子主题覆盖 WooCommerce 模板文件。

要覆盖的模板是single-product/short-description.php

在“woocommerce”文件夹 >“single-product”子文件夹中复制到您的chid主题后,打开/编辑short-description.php文件,并替换为:

<?php
/**
 * Single product short description
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/single-product/short-description.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates
 * @version 3.3.0
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit; // Exit if accessed directly.
}

global $post;

$short_description = apply_filters( 'woocommerce_short_description', $post->post_excerpt );

if ( ! $short_description ) {
    return;
} 

if ( $short_description && substr_count($short_description, '</p>') > 1 ) {
    $short_description = str_replace( ['<p class="', '<p>'], ['<p class="ukryj-klase-krotki ', '<p class="ukryj-klase-krotki">'], $short_description );
}

?>
<div class="woocommerce-product-details__short-description<?php echo $class; ?>">
    <?php echo $short_description; // WPCS: XSS ok. ?>
</div>

在这里,使用substr_count() php 函数,我们从产品简短描述中计算&lt;/p&gt; (结束标签) 的数量,以将ukryj-klase-krotki 作为类选择器添加到所有&lt;p&gt; 孩子使用str_replace() 函数的标签。经过测试并且可以工作。

【讨论】:

  • 我按照你写的做了一切,不幸的是它不起作用。无论哪种方式,我都不想更改父 DIV 类,但它的子类 - 如果有超过 1 个。就像我写的 jQuery 代码一样。
  • 这是我的子主题的屏幕:link 我想在 PHP 中获得的效果:link
  • 我不知道这是否重要,但我使用的是 WooCommerce 5.0 和最新的 PHP 版本
【解决方案2】:

如果你想安装插件来添加脚本,请看这里:https://it.wordpress.org/plugins/search/header+and+footer+scripts/

如果你想使用 PHP 代码,你需要在你的活动主题的 functions.php 文件中添加以下代码(如果我在子主题中使用它):

// add custom class
add_action( 'wp_footer', 'add_custom_class' );
function add_custom_class() {
    ?>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('.woocommerce-product-details__short-description:has(p:nth-of-type(2)) p').addClass('ukryj-klase-krotki');
        });
    </script>
    <?php
}

根据上述 cmets 的建议,您应该尽快通过更改不正确的产品数据来解决问题。

【讨论】:

  • 这只是我在 PHP 函数中插入的代码 - 它仍然是 jQuery。我正在寻找 PHP 解决方案 - 而不是 jQuery。我编写这段代码是为了展示我想在 PHP 中实现的目标。
猜你喜欢
  • 1970-01-01
  • 2013-02-24
  • 2011-02-26
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多