---
title: "Bulk Price Editor: Developer Hooks and Filters Reference"
description: "Developer reference for the WooCommerce Bulk Price Editor: filters, how the price filters fire, stored options and code examples."
url: "https://wpfactory.com/docs/bulk-price-editor-hooks-filters/"
updated: "2026-09-26"
category: Developers
---

# Bulk Price Editor: Developer Hooks and Filters Reference

## Bulk Price Editor developer reference: filters and options

This reference lists the code hooks and stored options in the [Price Update: Bulk Pricing Editor for WooCommerce](https://wpfactory.com/item/bulk-price-editor-for-woocommerce/). It is aimed at developers extending the plugin or reading its stored data. All names are taken directly from the source of Pro v2.0.4.

### Filters

The plugin exposes four filters. Three shape the price math and product query; one is the internal Pro gate.

| Filter | Arguments | Purpose |
| --- | --- | --- |
| `alg_wc_bpc_round_price` | `$price`, `$round_function`, `$round_coef` | Rounds the modified price. Pro registers the default handler; without it, the Rounding function has no effect. |
| `alg_wc_bpc_pretty_price` | `$price`, `$threshold` | Applies the charm-price ("pretty prices") shaping. Runs only when the threshold is above 0. |
| `alg_wc_bpc_product_query` | `$args`, `$taxonomy`, `$terms` | Adds a tax query to the product `WP_Query` for tag and attribute filtering. Pro registers the default handler. |
| `alg_wc_bpc_settings` | `$value`, `$type`, `$args` | Internal Pro gate. Pro returns an empty string to enable the Pro fields; without Pro it returns the passed default (the `disabled` attribute or an upsell note). |

### How the price filters fire

Inside `Alg_WC_Bulk_Price_Converter_Core::change_price()`, after the arithmetic and before the final store rounding:

```
// Rounding (only when a rounding function is chosen)
if ( 'none' != $this->atts['round_function'] ) {
    $modified_price = apply_filters(
        'alg_wc_bpc_round_price',
        $modified_price,
        $this->atts['round_function'],
        $this->atts['round_coef']
    );
}
// ... round to woocommerce_price_num_decimals ...
// Pretty price (only when threshold > 0)
if ( $this->atts['pretty_prices_threshold'] > 0 ) {
    $modified_price = apply_filters(
        'alg_wc_bpc_pretty_price',
        $modified_price,
        $this->atts['pretty_prices_threshold']
    );
}
```

The Pro handler for `alg_wc_bpc_round_price` is simply:

```
function round_price( $price, $round_function, $round_coef ) {
    return $round_function( $price / $round_coef ) * $round_coef;
}
```

So `$round_function` is one of the PHP callables `round`, `floor`, or `ceil`, and the price is snapped to the nearest multiple of `$round_coef`.

### Example: custom rounding to the nearest 0.95

To force all corrected prices to end in .95 regardless of the coefficient set in the UI:

```
add_filter( 'alg_wc_bpc_round_price', function( $price, $fn, $coef ) {
    return floor( $price ) + 0.95;
}, 20, 3 );
```

### Example: extend the product query

The plugin passes tag and attribute filters through `alg_wc_bpc_product_query`. You can add your own conditions to the same `WP_Query` args:

```
add_filter( 'alg_wc_bpc_product_query', function( $args, $taxonomy, $terms ) {
    // Only touch published products, for example.
    $args['post_status'] = 'publish';
    return $args;
}, 20, 3 );
```

### Stored options

Settings are plain options, read with `get_option()`. There are no custom tables.

| Option | Default | Meaning |
| --- | --- | --- |
| `alg_wc_bulk_price_converter_step` | `6` | Number of decimals; sets the step of the tool's number inputs (`1 / pow(10, value)`). |
| `alg_wc_bulk_price_converter_block_size` | `1024` | Products loaded per `WP_Query` page during a run. |
| `alg_wc_bulk_price_converter_time_limit` | `-1` | Seconds per query via `set_time_limit()`. `0` = no limit, `-1` = server default. |
| `alg_wc_bulk_price_converter_version` | current version | Tracks the installed version for the update routine. |

### How prices are written

The tool writes prices directly to post meta (`_price`, `_regular_price`, `_sale_price`) with `update_post_meta()` and then calls `wc_delete_product_transients()`. It does not go through the WooCommerce CRUD (`$product->set_price()`), so if you rely on the WooCommerce data store or the product meta lookup table, plan to resync after a large run. This is the mechanism to be aware of when reading prices your own integration depends on.

### Need a hand?

For extension questions, our team answers on the [Bulk Price Editor support forum](https://wpfactory.com/support/item/bulk-price-editor-for-woocommerce/).

Related articles

- [Bulk Price Editor Will Not Activate or Appear](https://wpfactory.com/docs/bulk-price-editor-fixes/)
- [Bulk Price Editor: Free vs Pro Comparison](https://wpfactory.com/docs/pro-vs-free-versions-price/)
- [Bulk Price Editor for WooCommerce: Every Field Explained](https://wpfactory.com/docs/bulk-price-converter/)
- [Getting Started: Install and Open the Bulk Price Editor](https://wpfactory.com/docs/bulk-price-editor-intro/)
- [How Bulk Price Changes Are Calculated (Order of Operations)](https://wpfactory.com/docs/bulk-price-editor-order-of-operations/)
