All 14 Bulk Editor sections

See every section

Bulk tools

Updated Bulk Editor 1.7.0Tested with WordPress 7.1

Select one or more cells in a column, then press Bulk tools in the toolbar, right-click, or press Shift+F10. On a tablet or phone, tap a cell to select it, then press Bulk tools:

Column typeTools
NumberCalculate (increase/decrease/set, by amount or percent, with rounding — prices and amounts start rounded to your store's number of decimals, and can end in .99 or another ending, or be rounded to a step such as 0.05; increase and decrease leave empty cells empty; start from the cell itself or from another number column), Fill a series, Find and replace. On Sale price: Sale price from regular price, rounded the way Calculate rounds (10 less 20% is 8.00 with Round to decimals), leaving a sale price that already holds the result as it is.
TextSet all selected, Find and replace, Add text, Change capitals (not on SKUs, slugs, coupon codes, keys, email or web addresses, passwords, and an order's states and postcodes). On coupon codes: Generate a coupon code.
CheckboxTick all selected, Untick all selected
DropdownSet all selected
DatePick a date for all selected
Rich textSet all selected, Add text
TagsAdd, remove or swap tags
Options (categories, taxonomies, multi-select fields)Add, remove or swap [column name]
GalleryAdd images to all selected
AttributesAdd attributes to selected products (leave it, replace it, or keep both sets of values when present), Remove attributes

Every record in the list. When the list runs to more than one page, Calculate, Set all selected, Find and replace, Add text and Change capitals offer Apply to: All N records in this list, which changes that column on every record the filters match, on every page, not only the cells selected on the page you are looking at. Every page is read first and only then written, so records that stop matching the filter as they change are not skipped. It goes through the same save as the grid, twenty records at a time with the progress in the toolbar, and Undo on the message at the end puts the whole run back, whether History recorded it as one point or several. Locked cells are left alone, and a sale price that would not be lower than the regular price holds its record back, as in the grid. Save or discard your own edits first. If a page could not list all its variations (see Display settings), the run stops before writing anything; show fewer rows per page and try again.

Add text puts words before or after what a cell holds: "SALE: " at the start of every selected name, or " Organic" at the end. Spaces are kept as you type them, so put one between the words. A cell that is empty stays empty unless you tick Also fill empty cells. On a description, short description or purchase note, the text is added as a paragraph of its own, before or after the rest, never inside it; in a description made of blocks it gets a block of its own. You can type HTML there; it is cleaned as the rest of that cell is (a description keeps an administrator's HTML as written, and a purchase note is cleaned for everyone, as on WooCommerce's product screen).

Change capitals offers Capitalise Each Word ("the north FACE men's jacket" becomes "The North Face Men's Jacket"), Sentence case (a capital at the start of each sentence, the rest small), lower case and UPPER CASE. Capitals follow your site's language (Settings > General > Site Language), accented letters included: on a Turkish site "istanbul" becomes "İstanbul", and "ÉCOLE" in lower case is "école". A letter after an apostrophe or a digit is not made a capital, so "Men's" stays "Men's" and "4k" stays "4k". It is not offered on SKUs, because the database treats two SKUs that differ only in capitals as the same SKU, nor on slugs and coupon codes, which are kept in small letters anyway, nor on an order's billing and shipping state and postcode: those are codes, and WooCommerce finds the state CA but not Ca. A name saved by a shop manager keeps its & as &, and characters such as &,   or ™ written that way are left exactly as they are, so the shop never shows "SALT & PEPPER". One written that way for a letter, such as Café, changes with the rest and is saved as the letter itself ("CAFÉ").

Both show the first selected row before and after under the fields, as you type. Applied to the selection, the cells change in the grid like any edit, tinted until you press Save changes, and the message says how many cells changed and how many were left as they were: a locked cell, an empty one, or one that already reads that way. Applied to every record in the list, they go through the run described above, with one Undo.

The run keeps to the list the question named. Filters, columns and rows per page are kept per person, not per browser tab, so opening the editor in another tab (which clears the filters unless Keep filters after reloading the page is on), applying a filter, changing Display or opening a view there changes them under this page too. Every page the run reads is checked against the list this page showed: its filters, its columns and their order, its sort and rows per page, and its number of records. If any of them has changed (new orders arriving under a filter, say), the run stops before it writes anything, says so, and shows the list as it now is; check it and run it again. The run reads the list by ID, whatever it is sorted by, so a price, a stock level or a units-sold figure that changes while it reads (an order coming in while the list is sorted by stock, say) does not move a record from one page to another and does not stop it, unless the change takes a record into or out of the filtered list.

A save is kept to the columns its page was built on. Changes are sent by column, and every batch of a save is sent with the columns its changes were numbered by when the save began, so if the columns have been shown, hidden or moved since (in another tab, say), a save from the grid, a Paste a list and the writing part of a run are refused rather than written into another column, and the message asks you to reload the page. A save of more than twenty rows is written in batches, so one refused this way part of the way through has already written the batches before that point: its message says so and how many records were saved ("so only 40 records were saved"), Undo on it puts them back, and after a run the page shows the list as it now is. Do not simply run a relative change such as Increase by 10% again: the records already saved would be raised twice. Undo first, or filter to the records that were not changed. A page left open while the plugin was updated asks you to reload it before it saves any change. Moving to another page, reloading, Apply filters, Clear filters and saving Display all bring the page up to date with columns another tab has changed.

While a save is still being written (the toolbar says "Saving 40 of 2,000…"), the page keeps to it: saving Display, moving to another page, reloading, Apply filters, Clear filters, opening a view, the sort buttons in the column headings, and Save under Custom fields or Taxonomies (which reload the page) wait, and say that your changes are still being saved. Try again once the save has finished. Another tab can still change the columns meanwhile; the rest of the save is then refused as described above. In the same way, while rows are still loading (just after saving Display, say), saving Display, Apply filters, Clear filters, opening or saving a view and the sort buttons wait and say that the list is still loading.

On Orders, a new Status does what changing it on WooCommerce's order screen does, one order at a time: WooCommerce may email each customer about the new status, and it may change stock. Setting Refunded also makes WooCommerce record a refund of the order's remaining total in the order. That record sends no money back; a refund through your payment provider is still yours to make. So before a new status is saved, from the grid, from Set all selected or for every order in the list, the editor asks first, and says so. Undo and History put the status back, but an email that has been sent stays sent, a refund WooCommerce recorded stays recorded, and putting a status back is a status change too, which WooCommerce may email about as well.

Calculate from another column. Calculate has a Start from choice above Operation. This column, the default, works on the cell's own value as it always has. Pick another number column instead, such as Cost of goods, Regular price, Sale price, Stock, Weight or a numeric custom field, and the calculation starts from that column's value on the same row: Increase by 60 percent from Cost of goods sets each regular price to the cost plus 60%, and Decrease by 20 percent from Regular price sets each sale price 20% below the regular price. Same as copies the other column's value; Set to is not offered then, because it ignores the other column. The same rounding applies from either starting point: Round to decimals keeps the decimals you ask for, as if the price were typed on WooCommerce's own product screen, so 10 plus 10% reads 11.00 and 12.50 plus 60% reads 20.00, while Round up and Round down give whole numbers and None keeps up to six decimals without adding zeros. Round to decimals rounds a half up, as a spreadsheet does, so 2.05 plus 10% (2.255) is 2.26 and 1.15 plus 30% (1.495) is 1.50. Money never goes below 0, a row whose starting cell is empty or not a plain number (such as "12 kg" or "1e3") is left as it is, a row that already holds the result is left alone rather than written again (a price of 20 stays 20 where the result is 20.00, so a run never rewrites a price whose number does not change), a locked cell stays locked, and a sale price that would not be below the regular price is held back and named, as with any edit. A line under the fields works out the first selected row before you apply, for example "First selected row: 12.5 → 20.00". It works with Apply to: All N records in this list too, and a run is one History point that Undo puts back. Only columns that are showing can be offered, because a hidden column is not loaded into the grid: show it in Display first. There is no cost column until you have one: WooCommerce's cost of goods feature (off by default, under WooCommerce → Settings → Advanced → Features) adds Cost of goods, or switch on a custom field that holds a cost as a Number column in Custom fields. The starting value is read the way its own column writes numbers, so a cost of 12,50 on a store that uses a decimal comma is read as twelve and a half, and the result is written the same way (20,00). A thousands separator is read as one only between groups of three digits, so 1,234.50 is one thousand two hundred and thirty-four and a half on a store that uses a decimal point.

Price endings. On a price, cost or amount column, the Rounding choice in Calculate and in Sale price from regular price also offers End in… and Round to a step. End in gives every result the same ending: pick 0.99, 0.95, 0.90 or 0.00, or Other and type your own, from 0 up to but not including 1, with no more decimals than your store shows (0.49, say; 0.999 is refused). Direction decides which way it goes: Up to the next (the default) never lowers a price, so 21.57 becomes 21.99 and 22.00 becomes 22.99, while Nearest takes the closest price with that ending, above or below, so 22.10 becomes 21.95 and 22.60 becomes 22.95 (a price exactly half way goes up). A price that already ends that way is left as it is. Round to a step rounds to 0.05, 0.10, 0.50 or 1, to the nearest step by default or up to the next, so 12.52 becomes 12.50. Both work on the price as your store shows it, at its number of decimals: 13.88 plus 8% is 14.9904, which the store shows as 14.99, so End in .99 up leaves it at 14.99 rather than moving it on to 15.99, and 12.13 plus 8% shows as 13.10, which is already on a step of 0.05. A price of 0 stays 0, so a free product is not given a price. On a store that prices without decimals (WooCommerce → Settings → General, Number of decimals 0) the endings are whole numbers instead, 9, 90 or 99 standing for the last digits, so 1234 up to 90 becomes 1290, and the steps are 5, 10, 50 and 100; an Other ending keeps the digits you type, so 05 ends prices in 05 (1234 up becomes 1305). A store with one decimal is offered 0.9, 0.5 and 0.0, and steps of 0.1, 0.5 and 1. A Direction you choose is kept when you switch between End in and Round to a step. The result is written the way your store writes prices (21,99 on a store with a decimal comma), with its number of decimals, and it never goes below 0: 0.30 to the nearest .99 is 0.99, not -0.01. Nor does a price above 0 ever become 0: where the nearest ending or step is 0, the next one up is used, however small the price, so 0.30 to the nearest .00 is 1.00, and so is 0.01, and 0.20 to the nearest step of 0.50 is 0.50. Only End in and Round to a step do this. Round down turns a price below 1 into 0, and Round to decimals turns a price into 0 when it is below half of its last decimal (below 0.50 with 0 decimals, below 0.05 with 1), so on cheap products use End in or Round to a step. The line under the fields shows what the first selected row becomes before anything is written, for example "First selected row: 19 → 20.99" for 19 plus 8% ending in .99. Everything else works as it does with any rounding: it applies to All N records in this list too, as one History point that Undo puts back, a price already holding the result is not written again, and a sale price that the ending brings up to the regular price or above is held back and named when you save. Rounding choices are not kept in saved views, and the default is still Round to decimals.

Row tools: Delete selected rows; for products Add a variation, Create variations from attributes, Duplicate, Open in the WordPress editor, View on the site; for orders the WooCommerce order actions (resend emails, regenerate download permissions), Add a private note, Add a note to the customer, Open order; for reviews Reply to selected reviews, Open in Comments, View on the site.

Replying to reviews. Select one or more reviews, right-click and choose Reply to selected reviews…, write the reply once and save it: the same reply is posted under each review, as you. A review still waiting for moderation is approved when its reply is posted, as Reply does on WordPress's own Comments screen. Only approved and pending reviews can be replied to: WordPress would post a reply to a review marked as spam or in the Trash on the product by itself, not under the review, so those are left out and the message says why. Before it posts, the editor looks under each review for the same reply from you, links and lists included, and does not post it a second time. The message says how many reviews were replied to, how many already had that reply from you, and how many could not be replied to and why, for example "Replied to 2 reviews. 1 review already has this reply from you, so it was not posted again." A review that already has the reply, or could not be replied to, is left as it was, so one waiting for moderation stays waiting. While a reply is being posted, choosing Reply again says the last reply is still being posted rather than sending it again, and a reply of yours sent from another tab meanwhile waits for it to finish.

Still stuck? Ask the developers who wrote it. We aim to reply within one business day.