如何添加自定义 woocommerce 管理字段类型

问题描述 投票:0回答:1

我已经向 woocommerce 管理字段添加了一种自定义字段类型,并且已 100% 正常工作。

但是此代码位于 woocommerce 插件中(woocommerce/includes/admin/class-wc-admin-settings.php)。

我现在的问题是如何排除或挂钩或过滤我的自定义 woocommerce 管理字段类型从 woocoommerce 插件到我的插件。因此,我的自定义字段类型仍然存在,并且在更新 woocommerce 时有效。

这是class-wc-admin-settings.php已定制的

<?php
...
class WC_Admin_Settings {
...

public static function output_fields( $options ) {
...
switch ( $value['type'] ) {
    case 'productcategory' :

    $option_value = (array) self::get_option( $value['id'] );

    ?><tr valign="top">
        <th scope="row" class="titledesc">
            <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
            <?php echo $tooltip_html; ?>
        </th>
        <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
            <fieldset>

                <ul class="" style="margin:0; padding:0;">
                <?php
                    $args = array(
                        'orderby' => 'name',
                        'hide_empty'=> 0,
                        'taxonomy' => 'product_cat' 
                    );

                    $all_categories = get_categories( $args );
                    $index = 0;
                    $count = count($all_categories);
                    $numItemsPerRow = ceil($count / 2);
                    $numItemsOffsetFix = $count % 2 == 1;

                    echo '<div class="columns" style="width:auto; display:inline-block; height:auto; float:left; padding:0; margin:0 25px 0 0;">';

                    foreach ($all_categories as $key => $val) {
                        if ($index > 0 and $index % $numItemsPerRow == 0) {
                            echo '</div><div class="columns">';
                            if ($numItemsOffsetFix) {
                                $numItemsPerRow--;
                                $numItemsOffsetFix = false;
                            }
                        }
                    //foreach ( $value['options'] as $key => $val ) {
                        ?>
                        <li style="">
                            <label><input type="checkbox" 
                                name="<?php echo esc_attr( $value['id'] ); ?>[]"
                                id="<?php echo esc_attr( $val->term_id )?>"
                                value="<?php echo esc_attr( $val->term_id )?>" 
                                <?php
                                    if ( in_array( $val->term_id,$option_value ) ) {
                                        echo ' checked="checked"';
                                    }
                                ?>
                                /> <?php echo $val->name; ?>
                            </label>
                        </li>
                        <?php
                        $index++;
                    }
                ?>
                </ul>
            </fieldset>
            <fieldset>
                <?php echo $description; ?>
            </fieldset>
        </td>
    </tr><?php
 break;
...
} //end switch

...
} //end output_fields function

public static function save_fields( $options ) {
...
    switch ( $option['type'] ) {
    ...
        case 'productcategory':
        $value = array_filter( array_map( 'wc_clean', (array) $raw_value ) );
        break;
    ...
    }
...
} //end save_fields function

...
} //end class
?>

谢谢您的建议。

php woocommerce hook-woocommerce
1个回答
1
投票

do_action

 语句中有一个 
default
 作为 
switch
的情况。这意味着,如果核心代码中尚未匹配任何内容,它将查看是否有任何内容附加到操作挂钩。同样,您可以通过
woocommerce_admin_settings_sanitize_option_$option_name
过滤器

进行消毒

因此,这是我最好的猜测:

// handle output of new settings type
add_action( 'woocommerce_admin_field_productcategory', 'output_productcategory_fields' );
function output_productcategory_fields( $value ) {

    $option_value = (array) WC_Admin_Settings::get_option( $value['id'] );

    ?><tr valign="top">
        <th scope="row" class="titledesc">
            <label for="<?php echo esc_attr( $value['id'] ); ?>"><?php echo esc_html( $value['title'] ); ?></label>
            <?php echo $tooltip_html; ?>
        </th>
        <td class="forminp forminp-<?php echo sanitize_title( $value['type'] ) ?>">
            <fieldset>

                <ul class="" style="margin:0; padding:0;">
                <?php
                    $args = array(
                        'orderby' => 'name',
                        'hide_empty'=> 0,
                        'taxonomy' => 'product_cat' 
                    );

                    $all_categories = get_categories( $args );
                    $index = 0;
                    $count = count($all_categories);
                    $numItemsPerRow = ceil($count / 2);
                    $numItemsOffsetFix = $count % 2 == 1;

                    echo '<div class="columns" style="width:auto; display:inline-block; height:auto; float:left; padding:0; margin:0 25px 0 0;">';

                    foreach ($all_categories as $key => $val) {
                        if ($index > 0 and $index % $numItemsPerRow == 0) {
                            echo '</div><div class="columns">';
                            if ($numItemsOffsetFix) {
                                $numItemsPerRow--;
                                $numItemsOffsetFix = false;
                            }
                        }
                    //foreach ( $value['options'] as $key => $val ) {
                        ?>
                        <li style="">
                            <label><input type="checkbox" 
                                name="<?php echo esc_attr( $value['id'] ); ?>[]"
                                id="<?php echo esc_attr( $val->term_id )?>"
                                value="<?php echo esc_attr( $val->term_id )?>" 
                                <?php
                                    if ( in_array( $val->term_id,$option_value ) ) {
                                        echo ' checked="checked"';
                                    }
                                ?>
                                /> <?php echo $val->name; ?>
                            </label>
                        </li>
                        <?php
                        $index++;
                    }
                ?>
                </ul>
            </fieldset>
            <fieldset>
                <?php echo $description; ?>
            </fieldset>
        </td>
    </tr><?php

}

// sanitize data for new settings type
add_filter( 'woocommerce_admin_settings_sanitize_option_productcategory', 'sanitize_productcategory_option', 10, 3 );
function sanitize_productcategory_option( $value, $option, $raw_value ){
    $value = array_filter( array_map( 'wc_clean', (array) $raw_value ) );
    return $value;
}
© www.soinside.com 2019 - 2024. All rights reserved.