jQuery 到 PHP:如果有多个子元素,则向子元素添加选择器类

jQuery to PHP: Add a selector class to children elements if more than one

提问人:webkoncept 提问时间:2/14/2021 最后编辑:LoicTheAztecwebkoncept 更新时间:2/15/2021 访问量:105

问:

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

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

这是我使用的jQuery代码:

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

它是如何工作的:

jQuery 检查产品简短描述中是否有多个元素。如果还有更多 - 它会将类“ukryj-klase-krotki”添加到所有元素中。然后我添加CSS类来隐藏产品简短描述中生成的第一个元素,因此我唯一想要的元素是可见的:<p><p><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 WordPress 模板 WooCommerce

评论

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

答:

0赞 Vincenzo Di Gaetano 2/14/2021 #1

如果您想安装插件来添加脚本,请在此处查看: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
}

如上述评论所示,您应该尽快通过更改不正确的产品数据来解决问题。

评论

0赞 webkoncept 2/14/2021
这只是我在 PHP 函数中插入的代码 - 它仍然是 jQuery。我正在寻找PHP解决方案 - 而不是jQuery。我写这段代码是为了展示我想在 PHP 中实现的目标。
3赞 LoicTheAztec 2/14/2021 #2

首先阅读模板结构和通过主题覆盖模板,了解如何通过活动子主题覆盖WooCommerce模板文件。

要覆盖的模板是单产品/简短描述.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 函数,我们从产品简短描述中计算(结束标签)的数量,以使用 str_replace() 函数将作为类选择器添加到所有子标签中。经过测试并有效。</p>ukryj-klase-krotki<p>

评论

0赞 webkoncept 2/15/2021
我按照你写的做了所有事情,不幸的是它不起作用。无论哪种方式,我都不想更改父 DIV 类,而是更改其子类 - 如果有超过 1 个。就像我写的jQuery代码一样。
0赞 webkoncept 2/15/2021
这是我的孩子主题的屏幕:链接我想在 PHP中获得的效果:链接
0赞 webkoncept 2/15/2021
我不知道这是否重要,但我使用的是 WooCommerce 5.0 和最新的 PHP 版本