首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行JS - Woocommerce的PHP函数

执行JS - Woocommerce的PHP函数
EN

Stack Overflow用户
提问于 2021-01-20 11:30:19
回答 1查看 36关注 0票数 0

我有一个JS函数,我正试图通过我的functions.php从子主题中执行它。这是我第一次使用PHP,所以如果我的代码很差,我很抱歉。

我的目标是尝试将page_title更改为在下拉筛选器中选择的内容。在此工作之后,我计划将category_name添加到.innerHTML的末尾。只有在选择了下拉列表的情况下,才会发生这种情况。如果它不是,那么只有类别将通过woocommerce的本地处理方式显示。

代码语言:javascript
复制
var machineEl = document.getElementsByClassName('woof_select_pa_machine').firstChild;
var machineValue = machineEl.value;
    
    machineEl.addEventListener('change', function dynamic_page_title() {

        if (machineValue != 'Product Machine') {
            
            document.getElementsByClassName('woocommerce-products-header__title').innerHTML = machineValue;
        }  
    });

这是我尝试在function.php中执行的第一个脚本。

代码语言:javascript
复制
<?php

echo '<script type="text/javascript">',
     'dynamic_page_title_js();',
     '</script>';
?>

或者,我尝试使用下面的代码来完成相同的任务,但目的是仅限于某些页面。虽然不确定我最终是否需要这个。我在我找到的另一个线程中使用了这组代码。

代码语言:javascript
复制
<?php

add_action ( 'wp_enqueue_scripts', 'dynamic_page_title_php');

function dynamic_page_title_php() {

    //$wp_query->get_queried_object()->cat_name;

    global $page_title;

    if( is_page() || is_single() )
    {
        switch($page_title->title_name ) // post_name is the post slug which is more consistent for matching to here
        {
            case 'shop':
                wp_enqueue_script('shop', get_template_directory_uri() . '/js/dynamic_page_title_js.js', array('jquery'), '', false);
                break;
           
        }
    } 
    
}

?>

下面是我试图覆盖的类的html。

代码语言:javascript
复制
<h1 class="woocommerce-products-header__title page-title">Sample Page</h1>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-22 06:05:40

我决定采取一条不同的路线来解决这个问题。我使用了一个js函数在过滤器select上更新page_title。然后,我使用另一个线程(Woocommerce: How to show Product Attribute name on title when in a category page and "filtering" products via '?pa_attribute=' on address bar)中提供的代码来处理function.php文件中的属性部分。php函数在加载时处理页面,将shop替换为属性名,在本例中为机器类型。js更新此属性并在filter select上添加类别。

当用户通过导航栏导航到某个类别时,仍有一些工作要在functions.php上完成,以便将类别名称添加到page_title。我已经发布了一个关于如何解决最后这个部分(Woocommerce: How to show Product Attribute name and Category name on title)的新问题,但是通过独立地利用这两个部分,它或多或少实现了我的预期。

另外,我目前在woof within product-filter插件中执行的JS。它是在Ajax完成后在JS中编写的。但我确实计划将它移到它自己的文件中,并仅从组织的角度调用该函数。

PHP

代码语言:javascript
复制
add_filter( 'woocommerce_page_title', 'custom_woocommerce_page_title', 15, 2 );

function custom_woocommerce_page_title( $page_title ) {
    if ( is_archive() ) {
        $exists_attr = false;

        foreach ( $_GET as $index => $value ) {
            if ( substr( $index, 0, 3 ) === 'pa_' ) {
                $attr_id = wc_attribute_taxonomy_id_by_name( $index );

                if ( $attr_id === 0 && $cat_id ) {
                    continue;
                }

                if ( ! $exists_attr /* && ! $exists_cat */) {
                    $exists_attr = true;

                    $page_title .= ' ';
                } else {
                    $page_title .= ' ';
                }

                $term = get_term_by( 'slug', esc_html( $value ), $index );
                $page_title =  $term->name;                     
                        
            }
        }

    }

    return $page_title;

}

JS

代码语言:javascript
复制
(function() {
  var machineEl = document.getElementsByClassName('woof_select woof_select_pa_machine')[0];
  var processEl = document.getElementsByClassName('woof_select woof_select_pa_processing')[0];
  var optionMachine = machineEl.querySelector("option[selected='selected']");
  var optionProcess = processEl.querySelector("option[selected='selected']");
  var machineValue = optionMachine.innerHTML;
  var processValue = optionProcess.innerHTML;
  var result = document.getElementsByClassName('woocommerce-products-header__title page-title')[0];
  if (machineValue != 'Product Machine' && processValue != 'Product Processing') {
            result.innerHTML = machineValue + " " + processValue;            
  }
  else if (machineValue != 'Product Machine') {
            result.innerHTML = machineValue;            
  }
  else if (processValue != 'Product Processing') {
            result.innerHTML = processValue;            
  }       
})()

一旦我将类别发布到page_title,我将更新此答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65802679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档