Merge branch 'woocommerce:trunk' into autocomplete-signup
This commit is contained in:
commit
af347d3dc0
|
@ -3,7 +3,7 @@ on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
inputs:
|
inputs:
|
||||||
ref:
|
ref:
|
||||||
description: 'By default the zip file is generated from the branch the workflow runs from, but you can specify an explicit reference to use instead here (e.g. refs/tags/tag_name). The resulting file will be available as an artifact on the workflow run.'
|
description: 'By default the zip file is generated from the branch the workflow runs from, but you can specify an explicit reference to use instead here (e.g. refs/tags/tag_name or refs/heads/release/x.x). The resulting file will be available as an artifact on the workflow run.'
|
||||||
required: false
|
required: false
|
||||||
default: ''
|
default: ''
|
||||||
jobs:
|
jobs:
|
||||||
|
|
|
@ -0,0 +1,120 @@
|
||||||
|
name: Add issue triage comments.
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types:
|
||||||
|
- labeled
|
||||||
|
jobs:
|
||||||
|
add-dev-comment:
|
||||||
|
if: "github.event.label.name == 'needs developer feedback'"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Add developer feedback comment
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Hi @${{ github.event.issue.user.login }},\n\n\
|
||||||
|
Thank you for opening the issue! It requires further feedback from the WooCommerce Core team.\n\n\
|
||||||
|
We are adding the `needs developer feedback` label to this issue so that the Core team could take a look.\n\n\
|
||||||
|
Please note it may take a few days for them to get to this issue. Thank you for your patience.'
|
||||||
|
})
|
||||||
|
add-reproduction-comment:
|
||||||
|
if: "github.event.label.name == 'status: needs reproduction'"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Add needs reproduction comment
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'We are adding the `status: needs reproduction` label to this issue to try reproduce it on the \
|
||||||
|
current released version of WooCommerce.\n\n\
|
||||||
|
Thank you for your patience.'
|
||||||
|
})
|
||||||
|
add-support-comment:
|
||||||
|
if: "github.event.label.name == 'type: support request'"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Add support request comment
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Hi @${{ github.event.issue.user.login }},\n\n\
|
||||||
|
While our goal is to address all the issues reported in this repository, \
|
||||||
|
GitHub should be treated as a place to report confirmed bugs only.\n\n\
|
||||||
|
The type of issue you submitted looks like a support request which may or may not reveal a bug once proper \
|
||||||
|
troubleshooting is done. In order to confirm the bug, please follow one of the steps below:\n\n\
|
||||||
|
- Review [WooCommerce Self-Service Guide](https://docs.woocommerce.com/document/woocommerce-self-service-guide/) \
|
||||||
|
to see if the solutions listed there apply to your case;\n\
|
||||||
|
- If you are a paying customer of WooCommerce, contact WooCommerce support by \
|
||||||
|
[opening a ticket or starting a live chat](https://woocommerce.com/contact-us/);\n\
|
||||||
|
- Make a post on [WooCommerce community forum](https://wordpress.org/support/plugin/woocommerce/)\n\n\
|
||||||
|
If you confirm the bug, please provide us with clear steps to reproduce it.\n\n\
|
||||||
|
We are closing this issue for now as it seems to be a support request and not a bug. \
|
||||||
|
If we missed something, please leave a comment and we will take a second look.'
|
||||||
|
})
|
||||||
|
- name: Close support request issue
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.update({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
state: 'closed'
|
||||||
|
})
|
||||||
|
add-votes-comment:
|
||||||
|
if: "github.event.label.name == 'votes needed'"
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
steps:
|
||||||
|
- name: Add votes needed comment
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Thanks for the suggestion @${{ github.event.issue.user.login }},\n\n\
|
||||||
|
While we appreciate you sharing your ideas with us, it doesn’t fit in with our current priorities for the project.\n\
|
||||||
|
At some point, we may revisit our priorities and look through the list of suggestions like this one to see if it \
|
||||||
|
warrants a second look.\n\n\
|
||||||
|
In the meantime, we are going to close this issue with the `votes needed` label and evaluate over time if this \
|
||||||
|
issue collects more feedback.\n\n\
|
||||||
|
Don’t be alarmed if you don’t see any activity on this issue for a while. \
|
||||||
|
We'll keep an eye on the popularity of this request.'
|
||||||
|
})
|
||||||
|
- name: Close votes needed issue
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.WC_BOT_TRIAGE_TOKEN }}
|
||||||
|
script: |
|
||||||
|
github.rest.issues.update({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
state: 'closed'
|
||||||
|
})
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
- This package is now transpiled with Babel, which allows the usage of modern, yet compatible JS code.
|
|
||||||
- A `specs/data` folder to store page element data.
|
- A `specs/data` folder to store page element data.
|
||||||
- Tests to verify that different top-level menu and their associated sub-menus load successfully.
|
- Tests to verify that different top-level menu and their associated sub-menus load successfully.
|
||||||
- Test scaffolding via `npx wc-e2e install @woocommerce/e2e-core-tests`
|
- Test scaffolding via `npx wc-e2e install @woocommerce/e2e-core-tests`
|
||||||
|
|
|
@ -9,8 +9,8 @@ const {
|
||||||
uiUnblocked,
|
uiUnblocked,
|
||||||
evalAndClick,
|
evalAndClick,
|
||||||
clickUpdateOrder,
|
clickUpdateOrder,
|
||||||
|
waitForSelector,
|
||||||
} = require( '@woocommerce/e2e-utils' );
|
} = require( '@woocommerce/e2e-utils' );
|
||||||
const { waitForSelector } = require( '@woocommerce/e2e-environment' );
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Evaluate and click a button selector then wait for a result selector.
|
* Evaluate and click a button selector then wait for a result selector.
|
||||||
|
|
|
@ -1,43 +1,32 @@
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Added the `resolveSingleE2EPath` method which builds a path to a specific E2E test
|
|
||||||
- It still supports the use of `plugins/woocommerce` and/or `tests/e2e` in file paths to avoid any breaking changes
|
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Added the ability to take screenshots from multiple test failures (when retried) in `utils/take-screenshot.js`.
|
|
||||||
|
|
||||||
## Added
|
## Added
|
||||||
|
|
||||||
- Added `post-results-to-github-pr.js` to post smoke test results to a GitHub PR.
|
- Added `post-results-to-github-pr.js` to post smoke test results to a GitHub PR.
|
||||||
- Added jest flags to generate a json test report
|
- Added jest flags to generate a json test report
|
||||||
- Added more entries to `default.json`
|
- Added more entries to `default.json`
|
||||||
- Print the full path to `test-results.json` when the tests ends to make it easier to find the test results file.
|
- Save `test-results.json` from test runs to the `tests/e2e` folder.
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- Added `await` for every call to `shopper.logout`
|
- Added `await` for every call to `shopper.logout`
|
||||||
- Updated `getLatestReleaseZipUrl()` to allow passing in an authorization token and simplified arguments to just the repository name
|
- Updated `getLatestReleaseZipUrl()` to allow passing in an authorization token and simplified arguments to just the repository name
|
||||||
- Added `upload.ini` which increases the limits for uploading files (such as for plugins) in the Docker environment
|
- Added `upload.ini` which increases the limits for uploading files (such as for plugins) in the Docker environment
|
||||||
- Test setup, scaffolding, and removal via `wc-e2e install` and `wc-e2e uninstall`
|
- Test setup, scaffolding, and removal via `wc-e2e install` and `wc-e2e uninstall`
|
||||||
|
|
||||||
## Fixed
|
|
||||||
|
|
||||||
- Updated the browserViewport in `jest.setup.js` to match the `defaultViewport` dimensions defined in `jest-puppeteer.config.js`
|
|
||||||
|
|
||||||
## Added
|
|
||||||
|
|
||||||
- Added quotes around `WORDPRESS_TITLE` value in .env file to address issue with docker compose 2 "key cannot contain a space" error.
|
- Added quotes around `WORDPRESS_TITLE` value in .env file to address issue with docker compose 2 "key cannot contain a space" error.
|
||||||
- Added `LATEST_WP_VERSION_MINUS` that allows setting a number to subtract from the current WordPress version for the WordPress Docker image.
|
- Added `LATEST_WP_VERSION_MINUS` that allows setting a number to subtract from the current WordPress version for the WordPress Docker image.
|
||||||
- Support for PHP_VERSION, MARIADB_VERSION environment variables for built in container initialization
|
- Support for PHP_VERSION, MARIADB_VERSION environment variables for built in container initialization
|
||||||
- `resolveLocalE2ePath` to resolve path to local E2E file
|
- `resolveLocalE2ePath` to resolve path to local E2E file
|
||||||
- `WC_E2E_FOLDER` for mapping plugin root to path within repo
|
- `WC_E2E_FOLDER` for mapping plugin root to path within repo
|
||||||
|
- Added the `resolveSingleE2EPath` method which builds a path to a specific E2E test
|
||||||
|
- Added the ability to take screenshots from multiple test failures (when retried) in `utils/take-screenshot.js`.
|
||||||
|
|
||||||
|
## Changed
|
||||||
|
|
||||||
|
- Updated `getLatestReleaseZipUrl()` to allow passing in an authorization token and simplified arguments to just the repository name
|
||||||
|
|
||||||
## Fixed
|
## Fixed
|
||||||
|
|
||||||
|
- Updated the browserViewport in `jest.setup.js` to match the `defaultViewport` dimensions defined in `jest-puppeteer.config.js`
|
||||||
- Use consistent `defaultViewport` in both headless and non-headless context
|
- Use consistent `defaultViewport` in both headless and non-headless context
|
||||||
|
- Add missing `config` dependency
|
||||||
|
|
||||||
# 0.2.3
|
# 0.2.3
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,10 @@ await takeScreenshotFor( 'name of current step' );
|
||||||
|
|
||||||
Screenshots will be saved to `tests/e2e/screenshots`. This folder is cleared at the beginning of each test run.
|
Screenshots will be saved to `tests/e2e/screenshots`. This folder is cleared at the beginning of each test run.
|
||||||
|
|
||||||
|
#### Test results
|
||||||
|
|
||||||
|
The test results are saved in `json` format in `tests/e2e/test-results.json`.
|
||||||
|
|
||||||
### Override default test timeout
|
### Override default test timeout
|
||||||
|
|
||||||
To override the default timeout for the tests, you can use the `DEFAULT_TIMEOUT_OVERRIDE` flag and pass in a maximum timeout in milliseconds. For example, you can pass it in when running the tests from the command line:
|
To override the default timeout for the tests, you can use the `DEFAULT_TIMEOUT_OVERRIDE` flag and pass in a maximum timeout in milliseconds. For example, you can pass it in when running the tests from the command line:
|
||||||
|
|
|
@ -76,7 +76,7 @@ if ( program.args.length == 1 ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
let jestCommand = 'jest';
|
let jestCommand = 'jest';
|
||||||
let outputFile = resolveLocalE2ePath('/test-results.json');
|
let outputFile = 'test-results.json';
|
||||||
const jestArgs = [
|
const jestArgs = [
|
||||||
'--maxWorkers=1',
|
'--maxWorkers=1',
|
||||||
'--rootDir=./',
|
'--rootDir=./',
|
||||||
|
@ -111,7 +111,11 @@ const jestProcess = spawnSync( jestCommand, jestArgs, {
|
||||||
env: envVars,
|
env: envVars,
|
||||||
} );
|
} );
|
||||||
|
|
||||||
console.log( 'Test result file path: ' + outputFile );
|
let results = resolvePackagePath( outputFile );
|
||||||
|
if ( fs.existsSync( results ) ) {
|
||||||
|
let localResults = resolveLocalE2ePath( outputFile );
|
||||||
|
fs.copyFileSync( results, localResults );
|
||||||
|
}
|
||||||
console.log( 'Jest exit code: ' + jestProcess.status );
|
console.log( 'Jest exit code: ' + jestProcess.status );
|
||||||
|
|
||||||
// Pass Jest exit code to npm
|
// Pass Jest exit code to npm
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
"@wordpress/jest-preset-default": "^7.1.3",
|
"@wordpress/jest-preset-default": "^7.1.3",
|
||||||
"app-root-path": "^3.0.0",
|
"app-root-path": "^3.0.0",
|
||||||
"commander": "4.1.1",
|
"commander": "4.1.1",
|
||||||
|
"config": "3.3.3",
|
||||||
"jest": "^25.1.0",
|
"jest": "^25.1.0",
|
||||||
"jest-circus": "25.1.0",
|
"jest-circus": "25.1.0",
|
||||||
"jest-each": "25.5.0",
|
"jest-each": "25.5.0",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"woocommerce/woocommerce-sniffs": "^0.1.0"
|
"woocommerce/woocommerce-sniffs": "^0.1.2"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"platform": {
|
"platform": {
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "c50f65dd9f9a26d397f7bb30228d7a88",
|
"content-hash": "51112a9a1fd6cd39c29579a93a59cf9c",
|
||||||
"packages": [],
|
"packages": [],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
{
|
{
|
||||||
|
@ -286,16 +286,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "woocommerce/woocommerce-sniffs",
|
"name": "woocommerce/woocommerce-sniffs",
|
||||||
"version": "0.1.1",
|
"version": "0.1.2",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/woocommerce/woocommerce-sniffs.git",
|
"url": "https://github.com/woocommerce/woocommerce-sniffs.git",
|
||||||
"reference": "eb604d751b61c42f31ff1aa24113c7c0de438553"
|
"reference": "5566270d280a300bc24bd0cb055a8b9325afdd6b"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/eb604d751b61c42f31ff1aa24113c7c0de438553",
|
"url": "https://api.github.com/repos/woocommerce/woocommerce-sniffs/zipball/5566270d280a300bc24bd0cb055a8b9325afdd6b",
|
||||||
"reference": "eb604d751b61c42f31ff1aa24113c7c0de438553",
|
"reference": "5566270d280a300bc24bd0cb055a8b9325afdd6b",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -322,7 +322,11 @@
|
||||||
"woocommerce",
|
"woocommerce",
|
||||||
"wordpress"
|
"wordpress"
|
||||||
],
|
],
|
||||||
"time": "2021-07-29T17:25:16+00:00"
|
"support": {
|
||||||
|
"issues": "https://github.com/woocommerce/woocommerce-sniffs/issues",
|
||||||
|
"source": "https://github.com/woocommerce/woocommerce-sniffs/tree/0.1.2"
|
||||||
|
},
|
||||||
|
"time": "2022-01-21T20:13:23+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "wp-coding-standards/wpcs",
|
"name": "wp-coding-standards/wpcs",
|
||||||
|
@ -381,5 +385,5 @@
|
||||||
"platform-overrides": {
|
"platform-overrides": {
|
||||||
"php": "7.0"
|
"php": "7.0"
|
||||||
},
|
},
|
||||||
"plugin-api-version": "1.1.0"
|
"plugin-api-version": "2.2.0"
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
"pelago/emogrifier": "3.1.0",
|
"pelago/emogrifier": "3.1.0",
|
||||||
"psr/container": "1.0.0",
|
"psr/container": "1.0.0",
|
||||||
"woocommerce/action-scheduler": "3.4.0",
|
"woocommerce/action-scheduler": "3.4.0",
|
||||||
"woocommerce/woocommerce-admin": "3.1.0-rc.1",
|
"woocommerce/woocommerce-admin": "3.1.0",
|
||||||
"woocommerce/woocommerce-blocks": "6.7.1"
|
"woocommerce/woocommerce-blocks": "6.7.3"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"bamarni/composer-bin-plugin": "^1.4",
|
"bamarni/composer-bin-plugin": "^1.4",
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "edd58bb30d9ec1e9ba74f499fb4a919b",
|
"content-hash": "d9b680722733ec1fae9414023f943830",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "automattic/jetpack-autoloader",
|
"name": "automattic/jetpack-autoloader",
|
||||||
|
@ -543,16 +543,16 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "woocommerce/woocommerce-admin",
|
"name": "woocommerce/woocommerce-admin",
|
||||||
"version": "3.1.0-rc.1",
|
"version": "3.1.0",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/woocommerce/woocommerce-admin.git",
|
"url": "https://github.com/woocommerce/woocommerce-admin.git",
|
||||||
"reference": "0c7a42f0c934f7f2e44c0534e2cec6fcb8362180"
|
"reference": "59dfff627d9b7b1d5396686e69b709a820f5e7e5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/0c7a42f0c934f7f2e44c0534e2cec6fcb8362180",
|
"url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/59dfff627d9b7b1d5396686e69b709a820f5e7e5",
|
||||||
"reference": "0c7a42f0c934f7f2e44c0534e2cec6fcb8362180",
|
"reference": "59dfff627d9b7b1d5396686e69b709a820f5e7e5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -608,22 +608,22 @@
|
||||||
"homepage": "https://github.com/woocommerce/woocommerce-admin",
|
"homepage": "https://github.com/woocommerce/woocommerce-admin",
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/woocommerce/woocommerce-admin/issues",
|
"issues": "https://github.com/woocommerce/woocommerce-admin/issues",
|
||||||
"source": "https://github.com/woocommerce/woocommerce-admin/tree/v3.1.0-rc.1"
|
"source": "https://github.com/woocommerce/woocommerce-admin/tree/v3.1.0"
|
||||||
},
|
},
|
||||||
"time": "2022-01-13T02:42:30+00:00"
|
"time": "2022-01-25T02:36:40+00:00"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "woocommerce/woocommerce-blocks",
|
"name": "woocommerce/woocommerce-blocks",
|
||||||
"version": "v6.7.1",
|
"version": "v6.7.3",
|
||||||
"source": {
|
"source": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/woocommerce/woocommerce-gutenberg-products-block.git",
|
"url": "https://github.com/woocommerce/woocommerce-gutenberg-products-block.git",
|
||||||
"reference": "d215803d7310046050bde26420c3082edcdbf866"
|
"reference": "742439da222272235190cbf14cc5ea0d4f178fa5"
|
||||||
},
|
},
|
||||||
"dist": {
|
"dist": {
|
||||||
"type": "zip",
|
"type": "zip",
|
||||||
"url": "https://api.github.com/repos/woocommerce/woocommerce-gutenberg-products-block/zipball/d215803d7310046050bde26420c3082edcdbf866",
|
"url": "https://api.github.com/repos/woocommerce/woocommerce-gutenberg-products-block/zipball/742439da222272235190cbf14cc5ea0d4f178fa5",
|
||||||
"reference": "d215803d7310046050bde26420c3082edcdbf866",
|
"reference": "742439da222272235190cbf14cc5ea0d4f178fa5",
|
||||||
"shasum": ""
|
"shasum": ""
|
||||||
},
|
},
|
||||||
"require": {
|
"require": {
|
||||||
|
@ -662,9 +662,9 @@
|
||||||
],
|
],
|
||||||
"support": {
|
"support": {
|
||||||
"issues": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues",
|
"issues": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues",
|
||||||
"source": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/v6.7.1"
|
"source": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/v6.7.3"
|
||||||
},
|
},
|
||||||
"time": "2022-01-07T16:15:03+00:00"
|
"time": "2022-01-24T10:38:10+00:00"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"packages-dev": [
|
"packages-dev": [
|
||||||
|
|
|
@ -545,7 +545,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
|
||||||
// If setting the status, ensure it's set to a valid status.
|
// If setting the status, ensure it's set to a valid status.
|
||||||
if ( true === $this->object_read ) {
|
if ( true === $this->object_read ) {
|
||||||
// Only allow valid new status.
|
// Only allow valid new status.
|
||||||
if ( ! in_array( 'wc-' . $new_status, $this->get_valid_statuses(), true ) && 'trash' !== $new_status ) {
|
if ( ! in_array( 'wc-' . $new_status, $this->get_valid_statuses(), true ) && 'trash' !== $new_status && 'auto-draft' !== $new_status ) {
|
||||||
$new_status = 'pending';
|
$new_status = 'pending';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -57,7 +57,7 @@ class WC_Admin_Menus {
|
||||||
|
|
||||||
$woocommerce_icon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiNhMmFhYjIiIGQ9Ik02MTIuMTkyIDQyNi4zMzZjMC02Ljg5Ni0zLjEzNi01MS42LTI4LTUxLjYtMzcuMzYgMC00Ni43MDQgNzIuMjU2LTQ2LjcwNCA4Mi42MjQgMCAzLjQwOCAzLjE1MiA1OC40OTYgMjguMDMyIDU4LjQ5NiAzNC4xOTItLjAzMiA0Ni42NzItNzIuMjg4IDQ2LjY3Mi04OS41MnptMjAyLjE5MiAwYzAtNi44OTYtMy4xNTItNTEuNi0yOC4wMzItNTEuNi0zNy4yOCAwLTQ2LjYwOCA3Mi4yNTYtNDYuNjA4IDgyLjYyNCAwIDMuNDA4IDMuMDcyIDU4LjQ5NiAyNy45NTIgNTguNDk2IDM0LjE5Mi0uMDMyIDQ2LjY4OC03Mi4yODggNDYuNjg4LTg5LjUyek0xNDEuMjk2Ljc2OGMtNjguMjI0IDAtMTIzLjUwNCA1NS40ODgtMTIzLjUwNCAxMjMuOTJ2NjUwLjcyYzAgNjguNDMyIDU1LjI5NiAxMjMuOTIgMTIzLjUwNCAxMjMuOTJoMzM5LjgwOGwxMjMuNTA0IDEyMy45MzZWODk5LjMyOGgyNzguMDQ4YzY4LjIyNCAwIDEyMy41Mi01NS40NzIgMTIzLjUyLTEyMy45MnYtNjUwLjcyYzAtNjguNDMyLTU1LjI5Ni0xMjMuOTItMTIzLjUyLTEyMy45MmgtNzQxLjM2em01MjYuODY0IDQyMi4xNmMwIDU1LjA4OC0zMS4wODggMTU0Ljg4LTEwMi42NCAxNTQuODgtNi4yMDggMC0xOC40OTYtMy42MTYtMjUuNDI0LTYuMDE2LTMyLjUxMi0xMS4xNjgtNTAuMTkyLTQ5LjY5Ni01Mi4zNTItNjYuMjU2IDAgMC0zLjA3Mi0xNy43OTItMy4wNzItNDAuNzUyIDAtMjIuOTkyIDMuMDcyLTQ1LjMyOCAzLjA3Mi00NS4zMjggMTUuNTUyLTc1LjcyOCA0My41NTItMTA2LjczNiA5Ni40NDgtMTA2LjczNiA1OS4wNzItLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4ek00ODYuNDk2IDMwMi40YzAgMy4zOTItNDMuNTUyIDE0MS4xNjgtNDMuNTUyIDIxMy40MjR2NzUuNzEyYy0yLjU5MiAxMi4wOC00LjE2IDI0LjE0NC0yMS44MjQgMjQuMTQ0LTQ2LjYwOCAwLTg4Ljg4LTE1MS40NzItOTIuMDE2LTE2MS44NC02LjIwOCA2Ljg5Ni02Mi4yNCAxNjEuODQtOTYuNDQ4IDE2MS44NC0yNC44NjQgMC00My41NTItMTEzLjY0OC00Ni42MDgtMTIzLjkzNkMxNzYuNzA0IDQzNi42NzIgMTYwIDMzNC4yMjQgMTYwIDMyNy4zMjhjMC0yMC42NzIgMS4xNTItMzguNzM2IDI2LjA0OC0zOC43MzYgNi4yMDggMCAyMS42IDYuMDY0IDIzLjcxMiAxNy4xNjggMTEuNjQ4IDYyLjAzMiAxNi42ODggMTIwLjUxMiAyOS4xNjggMTg1Ljk2OCAxLjg1NiAyLjkyOCAxLjUwNCA3LjAwOCA0LjU2IDEwLjQzMiAzLjE1Mi0xMC4yODggNjYuOTI4LTE2OC43ODQgOTQuOTYtMTY4Ljc4NCAyMi41NDQgMCAzMC40IDQ0LjU5MiAzMy41MzYgNjEuODI0IDYuMjA4IDIwLjY1NiAxMy4wODggNTUuMjE2IDIyLjQxNiA4Mi43NTIgMC0xMy43NzYgMTIuNDgtMjAzLjEyIDY1LjM5Mi0yMDMuMTIgMTguNTkyLjAzMiAyNi43MDQgNi45MjggMjYuNzA0IDI3LjU2OHpNODcwLjMyIDQyMi45MjhjMCA1NS4wODgtMzEuMDg4IDE1NC44OC0xMDIuNjQgMTU0Ljg4LTYuMTkyIDAtMTguNDQ4LTMuNjE2LTI1LjQyNC02LjAxNi0zMi40MzItMTEuMTY4LTUwLjE3Ni00OS42OTYtNTIuMjg4LTY2LjI1NiAwIDAtMy44ODgtMTcuOTItMy44ODgtNDAuODk2czMuODg4LTQ1LjE4NCAzLjg4OC00NS4xODRjMTUuNTUyLTc1LjcyOCA0My40ODgtMTA2LjczNiA5Ni4zODQtMTA2LjczNiA1OS4xMDQtLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4eiIvPjwvc3ZnPg==';
|
$woocommerce_icon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiNhMmFhYjIiIGQ9Ik02MTIuMTkyIDQyNi4zMzZjMC02Ljg5Ni0zLjEzNi01MS42LTI4LTUxLjYtMzcuMzYgMC00Ni43MDQgNzIuMjU2LTQ2LjcwNCA4Mi42MjQgMCAzLjQwOCAzLjE1MiA1OC40OTYgMjguMDMyIDU4LjQ5NiAzNC4xOTItLjAzMiA0Ni42NzItNzIuMjg4IDQ2LjY3Mi04OS41MnptMjAyLjE5MiAwYzAtNi44OTYtMy4xNTItNTEuNi0yOC4wMzItNTEuNi0zNy4yOCAwLTQ2LjYwOCA3Mi4yNTYtNDYuNjA4IDgyLjYyNCAwIDMuNDA4IDMuMDcyIDU4LjQ5NiAyNy45NTIgNTguNDk2IDM0LjE5Mi0uMDMyIDQ2LjY4OC03Mi4yODggNDYuNjg4LTg5LjUyek0xNDEuMjk2Ljc2OGMtNjguMjI0IDAtMTIzLjUwNCA1NS40ODgtMTIzLjUwNCAxMjMuOTJ2NjUwLjcyYzAgNjguNDMyIDU1LjI5NiAxMjMuOTIgMTIzLjUwNCAxMjMuOTJoMzM5LjgwOGwxMjMuNTA0IDEyMy45MzZWODk5LjMyOGgyNzguMDQ4YzY4LjIyNCAwIDEyMy41Mi01NS40NzIgMTIzLjUyLTEyMy45MnYtNjUwLjcyYzAtNjguNDMyLTU1LjI5Ni0xMjMuOTItMTIzLjUyLTEyMy45MmgtNzQxLjM2em01MjYuODY0IDQyMi4xNmMwIDU1LjA4OC0zMS4wODggMTU0Ljg4LTEwMi42NCAxNTQuODgtNi4yMDggMC0xOC40OTYtMy42MTYtMjUuNDI0LTYuMDE2LTMyLjUxMi0xMS4xNjgtNTAuMTkyLTQ5LjY5Ni01Mi4zNTItNjYuMjU2IDAgMC0zLjA3Mi0xNy43OTItMy4wNzItNDAuNzUyIDAtMjIuOTkyIDMuMDcyLTQ1LjMyOCAzLjA3Mi00NS4zMjggMTUuNTUyLTc1LjcyOCA0My41NTItMTA2LjczNiA5Ni40NDgtMTA2LjczNiA1OS4wNzItLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4ek00ODYuNDk2IDMwMi40YzAgMy4zOTItNDMuNTUyIDE0MS4xNjgtNDMuNTUyIDIxMy40MjR2NzUuNzEyYy0yLjU5MiAxMi4wOC00LjE2IDI0LjE0NC0yMS44MjQgMjQuMTQ0LTQ2LjYwOCAwLTg4Ljg4LTE1MS40NzItOTIuMDE2LTE2MS44NC02LjIwOCA2Ljg5Ni02Mi4yNCAxNjEuODQtOTYuNDQ4IDE2MS44NC0yNC44NjQgMC00My41NTItMTEzLjY0OC00Ni42MDgtMTIzLjkzNkMxNzYuNzA0IDQzNi42NzIgMTYwIDMzNC4yMjQgMTYwIDMyNy4zMjhjMC0yMC42NzIgMS4xNTItMzguNzM2IDI2LjA0OC0zOC43MzYgNi4yMDggMCAyMS42IDYuMDY0IDIzLjcxMiAxNy4xNjggMTEuNjQ4IDYyLjAzMiAxNi42ODggMTIwLjUxMiAyOS4xNjggMTg1Ljk2OCAxLjg1NiAyLjkyOCAxLjUwNCA3LjAwOCA0LjU2IDEwLjQzMiAzLjE1Mi0xMC4yODggNjYuOTI4LTE2OC43ODQgOTQuOTYtMTY4Ljc4NCAyMi41NDQgMCAzMC40IDQ0LjU5MiAzMy41MzYgNjEuODI0IDYuMjA4IDIwLjY1NiAxMy4wODggNTUuMjE2IDIyLjQxNiA4Mi43NTIgMC0xMy43NzYgMTIuNDgtMjAzLjEyIDY1LjM5Mi0yMDMuMTIgMTguNTkyLjAzMiAyNi43MDQgNi45MjggMjYuNzA0IDI3LjU2OHpNODcwLjMyIDQyMi45MjhjMCA1NS4wODgtMzEuMDg4IDE1NC44OC0xMDIuNjQgMTU0Ljg4LTYuMTkyIDAtMTguNDQ4LTMuNjE2LTI1LjQyNC02LjAxNi0zMi40MzItMTEuMTY4LTUwLjE3Ni00OS42OTYtNTIuMjg4LTY2LjI1NiAwIDAtMy44ODgtMTcuOTItMy44ODgtNDAuODk2czMuODg4LTQ1LjE4NCAzLjg4OC00NS4xODRjMTUuNTUyLTc1LjcyOCA0My40ODgtMTA2LjczNiA5Ni4zODQtMTA2LjczNiA1OS4xMDQtLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4eiIvPjwvc3ZnPg==';
|
||||||
|
|
||||||
if ( current_user_can( 'edit_others_shop_orders' ) ) {
|
if ( self::can_view_woocommerce_menu_item() ) {
|
||||||
$menu[] = array( '', 'read', 'separator-woocommerce', '', 'wp-menu-separator woocommerce' ); // WPCS: override ok.
|
$menu[] = array( '', 'read', 'separator-woocommerce', '', 'wp-menu-separator woocommerce' ); // WPCS: override ok.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ class WC_Admin_Menus {
|
||||||
* Add menu item.
|
* Add menu item.
|
||||||
*/
|
*/
|
||||||
public function reports_menu() {
|
public function reports_menu() {
|
||||||
if ( current_user_can( 'edit_others_shop_orders' ) ) {
|
if ( self::can_view_woocommerce_menu_item() ) {
|
||||||
add_submenu_page( 'woocommerce', __( 'Reports', 'woocommerce' ), __( 'Reports', 'woocommerce' ), 'view_woocommerce_reports', 'wc-reports', array( $this, 'reports_page' ) );
|
add_submenu_page( 'woocommerce', __( 'Reports', 'woocommerce' ), __( 'Reports', 'woocommerce' ), 'view_woocommerce_reports', 'wc-reports', array( $this, 'reports_page' ) );
|
||||||
} else {
|
} else {
|
||||||
add_menu_page( __( 'Sales reports', 'woocommerce' ), __( 'Sales reports', 'woocommerce' ), 'view_woocommerce_reports', 'wc-reports', array( $this, 'reports_page' ), 'dashicons-chart-bar', '55.6' );
|
add_menu_page( __( 'Sales reports', 'woocommerce' ), __( 'Sales reports', 'woocommerce' ), 'view_woocommerce_reports', 'wc-reports', array( $this, 'reports_page' ), 'dashicons-chart-bar', '55.6' );
|
||||||
|
@ -86,6 +86,13 @@ class WC_Admin_Menus {
|
||||||
add_action( 'load-' . $settings_page, array( $this, 'settings_page_init' ) );
|
add_action( 'load-' . $settings_page, array( $this, 'settings_page_init' ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the user can access the top-level WooCommerce item.
|
||||||
|
*/
|
||||||
|
public static function can_view_woocommerce_menu_item() {
|
||||||
|
return current_user_can( 'edit_others_shop_orders' );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loads gateways and shipping methods into memory for use within settings.
|
* Loads gateways and shipping methods into memory for use within settings.
|
||||||
*/
|
*/
|
||||||
|
@ -241,7 +248,7 @@ class WC_Admin_Menus {
|
||||||
* @return bool
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public function custom_menu_order( $enabled ) {
|
public function custom_menu_order( $enabled ) {
|
||||||
return $enabled || current_user_can( 'edit_others_shop_orders' );
|
return $enabled || self::can_view_woocommerce_menu_item();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -57,8 +57,9 @@ defined( 'ABSPATH' ) || exit;
|
||||||
* @since 3.6.0
|
* @since 3.6.0
|
||||||
*
|
*
|
||||||
* @param WP_Post $variation Post data.
|
* @param WP_Post $variation Post data.
|
||||||
|
* @param int $loop Position in the loop.
|
||||||
*/
|
*/
|
||||||
do_action( 'woocommerce_variation_header', $variation );
|
do_action( 'woocommerce_variation_header', $variation, $loop );
|
||||||
?>
|
?>
|
||||||
</h3>
|
</h3>
|
||||||
<div class="woocommerce_variable_attributes wc-metabox-content" style="display: none;">
|
<div class="woocommerce_variable_attributes wc-metabox-content" style="display: none;">
|
||||||
|
|
|
@ -1056,7 +1056,6 @@ class WC_Countries {
|
||||||
'GT' => array(
|
'GT' => array(
|
||||||
'postcode' => array(
|
'postcode' => array(
|
||||||
'required' => false,
|
'required' => false,
|
||||||
'hidden' => true,
|
|
||||||
),
|
),
|
||||||
'state' => array(
|
'state' => array(
|
||||||
'label' => __( 'Department', 'woocommerce' ),
|
'label' => __( 'Department', 'woocommerce' ),
|
||||||
|
|
|
@ -169,6 +169,10 @@ class WC_Install {
|
||||||
'wc_update_600_migrate_rate_limit_options',
|
'wc_update_600_migrate_rate_limit_options',
|
||||||
'wc_update_600_db_version',
|
'wc_update_600_db_version',
|
||||||
),
|
),
|
||||||
|
'6.3.0' => array(
|
||||||
|
'wc_update_630_create_product_attributes_lookup_table',
|
||||||
|
'wc_update_630_db_version',
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -586,22 +590,22 @@ class WC_Install {
|
||||||
$pages = apply_filters(
|
$pages = apply_filters(
|
||||||
'woocommerce_create_pages',
|
'woocommerce_create_pages',
|
||||||
array(
|
array(
|
||||||
'shop' => array(
|
'shop' => array(
|
||||||
'name' => _x( 'shop', 'Page slug', 'woocommerce' ),
|
'name' => _x( 'shop', 'Page slug', 'woocommerce' ),
|
||||||
'title' => _x( 'Shop', 'Page title', 'woocommerce' ),
|
'title' => _x( 'Shop', 'Page title', 'woocommerce' ),
|
||||||
'content' => '',
|
'content' => '',
|
||||||
),
|
),
|
||||||
'cart' => array(
|
'cart' => array(
|
||||||
'name' => _x( 'cart', 'Page slug', 'woocommerce' ),
|
'name' => _x( 'cart', 'Page slug', 'woocommerce' ),
|
||||||
'title' => _x( 'Cart', 'Page title', 'woocommerce' ),
|
'title' => _x( 'Cart', 'Page title', 'woocommerce' ),
|
||||||
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']<!-- /wp:shortcode -->',
|
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_cart_shortcode_tag', 'woocommerce_cart' ) . ']<!-- /wp:shortcode -->',
|
||||||
),
|
),
|
||||||
'checkout' => array(
|
'checkout' => array(
|
||||||
'name' => _x( 'checkout', 'Page slug', 'woocommerce' ),
|
'name' => _x( 'checkout', 'Page slug', 'woocommerce' ),
|
||||||
'title' => _x( 'Checkout', 'Page title', 'woocommerce' ),
|
'title' => _x( 'Checkout', 'Page title', 'woocommerce' ),
|
||||||
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']<!-- /wp:shortcode -->',
|
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_checkout_shortcode_tag', 'woocommerce_checkout' ) . ']<!-- /wp:shortcode -->',
|
||||||
),
|
),
|
||||||
'myaccount' => array(
|
'myaccount' => array(
|
||||||
'name' => _x( 'my-account', 'Page slug', 'woocommerce' ),
|
'name' => _x( 'my-account', 'Page slug', 'woocommerce' ),
|
||||||
'title' => _x( 'My account', 'Page title', 'woocommerce' ),
|
'title' => _x( 'My account', 'Page title', 'woocommerce' ),
|
||||||
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']<!-- /wp:shortcode -->',
|
'content' => '<!-- wp:shortcode -->[' . apply_filters( 'woocommerce_my_account_shortcode_tag', 'woocommerce_my_account' ) . ']<!-- /wp:shortcode -->',
|
||||||
|
|
|
@ -184,6 +184,6 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter {
|
||||||
* @return int
|
* @return int
|
||||||
*/
|
*/
|
||||||
public function get_percent_complete() {
|
public function get_percent_complete() {
|
||||||
return $this->total_rows ? floor( ( $this->get_total_exported() / $this->total_rows ) * 100 ) : 100;
|
return $this->total_rows ? (int) floor( ( $this->get_total_exported() / $this->total_rows ) * 100 ) : 100;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -924,7 +924,7 @@ class WC_REST_Orders_V2_Controller extends WC_REST_CRUD_Controller {
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
protected function get_order_statuses() {
|
protected function get_order_statuses() {
|
||||||
$order_statuses = array();
|
$order_statuses = array( 'auto-draft' );
|
||||||
|
|
||||||
foreach ( array_keys( wc_get_order_statuses() ) as $status ) {
|
foreach ( array_keys( wc_get_order_statuses() ) as $status ) {
|
||||||
$order_statuses[] = str_replace( 'wc-', '', $status );
|
$order_statuses[] = str_replace( 'wc-', '', $status );
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
defined( 'ABSPATH' ) || exit;
|
defined( 'ABSPATH' ) || exit;
|
||||||
|
|
||||||
use Automattic\WooCommerce\Internal\AssignDefaultCategory;
|
use Automattic\WooCommerce\Internal\AssignDefaultCategory;
|
||||||
|
use Automattic\WooCommerce\Internal\ProductAttributesLookup\DataRegenerator;
|
||||||
|
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update file paths for 2.0
|
* Update file paths for 2.0
|
||||||
|
@ -2306,7 +2308,7 @@ function wc_update_560_db_version() {
|
||||||
function wc_update_600_migrate_rate_limit_options() {
|
function wc_update_600_migrate_rate_limit_options() {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
$rate_limits = $wpdb->get_results(
|
$rate_limits = $wpdb->get_results(
|
||||||
"
|
"
|
||||||
SELECT option_name, option_value
|
SELECT option_name, option_value
|
||||||
FROM $wpdb->options
|
FROM $wpdb->options
|
||||||
|
@ -2335,3 +2337,28 @@ function wc_update_600_migrate_rate_limit_options() {
|
||||||
function wc_update_600_db_version() {
|
function wc_update_600_db_version() {
|
||||||
WC_Install::update_db_version( '6.0.0' );
|
WC_Install::update_db_version( '6.0.0' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create the product attributes lookup table and initiate its filling,
|
||||||
|
* unless the table had been already created manually (via the tools page).
|
||||||
|
*
|
||||||
|
* @return false Always false, since the LookupDataStore class handles all the data filling process.
|
||||||
|
*/
|
||||||
|
function wc_update_630_create_product_attributes_lookup_table() {
|
||||||
|
$data_store = wc_get_container()->get( LookupDataStore::class );
|
||||||
|
if ( $data_store->check_lookup_table_exists() ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data_regenerator = wc_get_container()->get( DataRegenerator::class );
|
||||||
|
$data_regenerator->initiate_regeneration();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Update DB version to 6.3.0.
|
||||||
|
*/
|
||||||
|
function wc_update_630_db_version() {
|
||||||
|
WC_Install::update_db_version( '6.3.0' );
|
||||||
|
}
|
||||||
|
|
|
@ -185,7 +185,7 @@ $tt2-gray: #f7f7f7;
|
||||||
button[name='add-to-cart'],
|
button[name='add-to-cart'],
|
||||||
input[name='submit'],
|
input[name='submit'],
|
||||||
button.single_add_to_cart_button,
|
button.single_add_to_cart_button,
|
||||||
button[type='submit'] {
|
button[type='submit']:not(.wp-block-search__button) {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
|
@ -294,10 +294,20 @@ $tt2-gray: #f7f7f7;
|
||||||
border-radius: 1rem;
|
border-radius: 1rem;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
line-height: 1.5rem;
|
line-height: 1.5rem;
|
||||||
padding: 0 0.5rem 0 0.5rem;
|
padding: 0;
|
||||||
font-size: 0.6rem;
|
font-size: 0.6rem;
|
||||||
background: var( --wp--preset--color--white );;
|
background: var( --wp--preset--color--white );
|
||||||
border-color: var( --wp--preset--color--white );
|
border-color: var( --wp--preset--color--white );
|
||||||
|
height: 1.5rem;
|
||||||
|
width: 1.5rem;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&::before {
|
||||||
|
content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" focusable="false" viewBox="0 0 24 24" width="24" height="24"><path d="M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z" /></svg>');
|
||||||
|
display: block;
|
||||||
|
transform: rotateY(180deg);
|
||||||
|
margin-left: 1.55rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
figure.woocommerce-product-gallery__wrapper {
|
figure.woocommerce-product-gallery__wrapper {
|
||||||
|
@ -747,6 +757,12 @@ $tt2-gray: #f7f7f7;
|
||||||
color: var(--wp--preset--color--black);
|
color: var(--wp--preset--color--black);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.woocommerce-orders-table__cell-order-actions {
|
||||||
|
a.button {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -884,7 +900,8 @@ $tt2-gray: #f7f7f7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.woocommerce-checkout {
|
.woocommerce-checkout,
|
||||||
|
&.woocommerce-order-pay {
|
||||||
display: table;
|
display: table;
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
|
@ -923,11 +940,13 @@ $tt2-gray: #f7f7f7;
|
||||||
|
|
||||||
.woocommerce-billing-fields__field-wrapper,
|
.woocommerce-billing-fields__field-wrapper,
|
||||||
.woocommerce-checkout-review-order-table,
|
.woocommerce-checkout-review-order-table,
|
||||||
.woocommerce-checkout-payment {
|
.woocommerce-checkout-payment,
|
||||||
|
#payment {
|
||||||
margin-top: 4rem;
|
margin-top: 4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.woocommerce-checkout-review-order-table {
|
.woocommerce-checkout-review-order-table,
|
||||||
|
#order_review .shop_table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
||||||
|
@ -1204,3 +1223,44 @@ $tt2-gray: #f7f7f7;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.wp-block-search {
|
||||||
|
.wp-block-search__label {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.wp-block-search__input {
|
||||||
|
padding: .9rem 1.1rem;
|
||||||
|
border: 1px solid var(--wp--preset--color--black);
|
||||||
|
}
|
||||||
|
.wp-block-search__button {
|
||||||
|
padding: 1rem 1.2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wc-block-product-search {
|
||||||
|
form {
|
||||||
|
.wc-block-product-search__fields {
|
||||||
|
display: flex;
|
||||||
|
flex: auto;
|
||||||
|
flex-wrap: nowrap;
|
||||||
|
max-width: 100%;
|
||||||
|
|
||||||
|
.wc-block-product-search__field {
|
||||||
|
padding: .9rem 1.1rem;
|
||||||
|
flex-grow: 1;
|
||||||
|
border: 1px solid var(--wp--preset--color--black);
|
||||||
|
font-size: inherit;
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wc-block-product-search__button {
|
||||||
|
display: flex;
|
||||||
|
background-color: var( --wp--preset--color--primary );
|
||||||
|
color: #fff;
|
||||||
|
border: 1px solid var(--wp--preset--color--black);
|
||||||
|
padding: 1rem 1.2rem;
|
||||||
|
margin: 0 0 0 .7rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -548,7 +548,7 @@ dl.variation,
|
||||||
margin-right: 0.5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input[type="number"] {
|
||||||
width: 5em;
|
width: 5em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,9 @@ defined( 'ABSPATH' ) || exit;
|
||||||
* the data store classes) whenever a product is created/updated.
|
* the data store classes) whenever a product is created/updated.
|
||||||
*
|
*
|
||||||
* Additionally, after the regeneration is completed a 'woocommerce_attribute_lookup_enabled' option
|
* Additionally, after the regeneration is completed a 'woocommerce_attribute_lookup_enabled' option
|
||||||
* with a value of 'no' will have been created.
|
* with a value of 'yes' will have been created, thus effectively enabling the table usage
|
||||||
|
* (with an exception: if the regeneration was manually aborted via deleting the
|
||||||
|
* 'woocommerce_attribute_lookup_regeneration_in_progress' option) the option will be set to 'no'.
|
||||||
*
|
*
|
||||||
* This class also adds two entries to the Status - Tools menu: one for manually regenerating the table contents,
|
* This class also adds two entries to the Status - Tools menu: one for manually regenerating the table contents,
|
||||||
* and another one for enabling or disabling the actual lookup table usage.
|
* and another one for enabling or disabling the actual lookup table usage.
|
||||||
|
@ -84,16 +86,11 @@ class DataRegenerator {
|
||||||
* deletes the lookup table and related options if they exist,
|
* deletes the lookup table and related options if they exist,
|
||||||
* then it creates the table and runs the first step of the regeneration process.
|
* then it creates the table and runs the first step of the regeneration process.
|
||||||
*
|
*
|
||||||
* This is the method that should be used as a callback for a data regeneration in wc-update-functions, e.g.:
|
* This method is intended ONLY to be used as a callback for a db update in wc-update-functions,
|
||||||
*
|
* regeneration triggered from the tools page will use initiate_regeneration_from_tools_page instead.
|
||||||
* function wc_update_XX_regenerate_product_attributes_lookup_table() {
|
|
||||||
* wc_get_container()->get(DataRegenerator::class)->initiate_regeneration();
|
|
||||||
* return false;
|
|
||||||
* }
|
|
||||||
*
|
|
||||||
* (Note how we are returning "false" since the class handles the step scheduling by itself).
|
|
||||||
*/
|
*/
|
||||||
public function initiate_regeneration() {
|
public function initiate_regeneration() {
|
||||||
|
$this->data_store->unset_regeneration_aborted_flag();
|
||||||
$this->enable_or_disable_lookup_table_usage( false );
|
$this->enable_or_disable_lookup_table_usage( false );
|
||||||
|
|
||||||
$this->delete_all_attributes_lookup_data();
|
$this->delete_all_attributes_lookup_data();
|
||||||
|
@ -101,23 +98,19 @@ class DataRegenerator {
|
||||||
if ( $products_exist ) {
|
if ( $products_exist ) {
|
||||||
$this->enqueue_regeneration_step_run();
|
$this->enqueue_regeneration_step_run();
|
||||||
} else {
|
} else {
|
||||||
$this->finalize_regeneration();
|
$this->finalize_regeneration( true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all the existing data related to the lookup table, including the table itself.
|
* Delete all the existing data related to the lookup table, including the table itself.
|
||||||
*
|
|
||||||
* Shortcut to run this method in case the debug tools UI isn't available or for quick debugging:
|
|
||||||
*
|
|
||||||
* wp eval "wc_get_container()->get(Automattic\WooCommerce\Internal\ProductAttributesLookup\DataRegenerator::class)->delete_all_attributes_lookup_data();"
|
|
||||||
*/
|
*/
|
||||||
public function delete_all_attributes_lookup_data() {
|
private function delete_all_attributes_lookup_data() {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
delete_option( 'woocommerce_attribute_lookup_enabled' );
|
delete_option( 'woocommerce_attribute_lookup_enabled' );
|
||||||
delete_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
delete_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
||||||
delete_option( 'woocommerce_attribute_lookup_last_products_page_processed' );
|
delete_option( 'woocommerce_attribute_lookup_processed_count' );
|
||||||
$this->data_store->unset_regeneration_in_progress_flag();
|
$this->data_store->unset_regeneration_in_progress_flag();
|
||||||
|
|
||||||
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
// phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared
|
||||||
|
@ -167,7 +160,7 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
|
|
||||||
$this->data_store->set_regeneration_in_progress_flag();
|
$this->data_store->set_regeneration_in_progress_flag();
|
||||||
update_option( 'woocommerce_attribute_lookup_last_product_id_to_process', current( $last_existing_product_id ) );
|
update_option( 'woocommerce_attribute_lookup_last_product_id_to_process', current( $last_existing_product_id ) );
|
||||||
update_option( 'woocommerce_attribute_lookup_last_products_page_processed', 0 );
|
update_option( 'woocommerce_attribute_lookup_processed_count', 0 );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -178,6 +171,10 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
*/
|
*/
|
||||||
private function run_regeneration_step_callback() {
|
private function run_regeneration_step_callback() {
|
||||||
if ( ! $this->data_store->regeneration_is_in_progress() ) {
|
if ( ! $this->data_store->regeneration_is_in_progress() ) {
|
||||||
|
// No regeneration in progress at this point means that the regeneration process
|
||||||
|
// was manually aborted via deleting the 'woocommerce_attribute_lookup_regeneration_in_progress' option.
|
||||||
|
$this->data_store->set_regeneration_aborted_flag();
|
||||||
|
$this->finalize_regeneration( false );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +182,7 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
if ( $result ) {
|
if ( $result ) {
|
||||||
$this->enqueue_regeneration_step_run();
|
$this->enqueue_regeneration_step_run();
|
||||||
} else {
|
} else {
|
||||||
$this->finalize_regeneration();
|
$this->finalize_regeneration( true );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,14 +206,21 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
* @return bool True if more steps need to be run, false otherwise.
|
* @return bool True if more steps need to be run, false otherwise.
|
||||||
*/
|
*/
|
||||||
private function do_regeneration_step() {
|
private function do_regeneration_step() {
|
||||||
$last_products_page_processed = get_option( 'woocommerce_attribute_lookup_last_products_page_processed' );
|
/**
|
||||||
$current_products_page = (int) $last_products_page_processed + 1;
|
* Filter to alter the count of products that will be processed in each step of the product attributes lookup table regeneration process.
|
||||||
|
*
|
||||||
|
* @since 6.3
|
||||||
|
* @param int $count Default processing step size.
|
||||||
|
*/
|
||||||
|
$products_per_generation_step = apply_filters( 'woocommerce_attribute_lookup_regeneration_step_size', self::PRODUCTS_PER_GENERATION_STEP );
|
||||||
|
|
||||||
|
$products_already_processed = get_option( 'woocommerce_attribute_lookup_processed_count', 0 );
|
||||||
|
|
||||||
$product_ids = WC()->call_function(
|
$product_ids = WC()->call_function(
|
||||||
'wc_get_products',
|
'wc_get_products',
|
||||||
array(
|
array(
|
||||||
'limit' => self::PRODUCTS_PER_GENERATION_STEP,
|
'limit' => $products_per_generation_step,
|
||||||
'page' => $current_products_page,
|
'offset' => $products_already_processed,
|
||||||
'orderby' => array(
|
'orderby' => array(
|
||||||
'ID' => 'ASC',
|
'ID' => 'ASC',
|
||||||
),
|
),
|
||||||
|
@ -232,7 +236,8 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
$this->data_store->create_data_for_product( $id );
|
$this->data_store->create_data_for_product( $id );
|
||||||
}
|
}
|
||||||
|
|
||||||
update_option( 'woocommerce_attribute_lookup_last_products_page_processed', $current_products_page );
|
$products_already_processed += count( $product_ids );
|
||||||
|
update_option( 'woocommerce_attribute_lookup_processed_count', $products_already_processed );
|
||||||
|
|
||||||
$last_product_id_to_process = get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
$last_product_id_to_process = get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
||||||
return end( $product_ids ) < $last_product_id_to_process;
|
return end( $product_ids ) < $last_product_id_to_process;
|
||||||
|
@ -240,11 +245,14 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cleanup/final option setup after the regeneration has been completed.
|
* Cleanup/final option setup after the regeneration has been completed.
|
||||||
|
*
|
||||||
|
* @param bool $enable_usage Whether the table usage should be enabled or not.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
private function finalize_regeneration() {
|
private function finalize_regeneration( bool $enable_usage ) {
|
||||||
delete_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
delete_option( 'woocommerce_attribute_lookup_last_product_id_to_process' );
|
||||||
delete_option( 'woocommerce_attribute_lookup_last_products_page_processed' );
|
delete_option( 'woocommerce_attribute_lookup_processed_count' );
|
||||||
update_option( 'woocommerce_attribute_lookup_enabled', 'no' );
|
update_option( 'woocommerce_attribute_lookup_enabled', $enable_usage ? 'yes' : 'no' );
|
||||||
$this->data_store->unset_regeneration_in_progress_flag();
|
$this->data_store->unset_regeneration_in_progress_flag();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -255,76 +263,44 @@ CREATE TABLE ' . $this->lookup_table_name . '(
|
||||||
* @return array The tools array with the entry added.
|
* @return array The tools array with the entry added.
|
||||||
*/
|
*/
|
||||||
private function add_initiate_regeneration_entry_to_tools_array( array $tools_array ) {
|
private function add_initiate_regeneration_entry_to_tools_array( array $tools_array ) {
|
||||||
$lookup_table_exists = $this->data_store->check_lookup_table_exists();
|
if ( ! $this->data_store->check_lookup_table_exists() ) {
|
||||||
$generation_is_in_progress = $this->data_store->regeneration_is_in_progress();
|
return $tools_array;
|
||||||
|
|
||||||
// Regenerate table.
|
|
||||||
|
|
||||||
if ( $lookup_table_exists ) {
|
|
||||||
$generate_item_name = __( 'Regenerate the product attributes lookup table', 'woocommerce' );
|
|
||||||
$generate_item_desc = __( 'This tool will regenerate the product attributes lookup table data from existing product(s) data. This process may take a while.', 'woocommerce' );
|
|
||||||
$generate_item_return = __( 'Product attributes lookup table data is regenerating', 'woocommerce' );
|
|
||||||
$generate_item_button = __( 'Regenerate', 'woocommerce' );
|
|
||||||
} else {
|
|
||||||
$generate_item_name = __( 'Create and fill product attributes lookup table', 'woocommerce' );
|
|
||||||
$generate_item_desc = __( 'This tool will create the product attributes lookup table data and fill it with existing products data. This process may take a while.', 'woocommerce' );
|
|
||||||
$generate_item_return = __( 'Product attributes lookup table is being filled', 'woocommerce' );
|
|
||||||
$generate_item_button = __( 'Create', 'woocommerce' );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$entry = array(
|
$generation_is_in_progress = $this->data_store->regeneration_is_in_progress();
|
||||||
'name' => $generate_item_name,
|
|
||||||
'desc' => $generate_item_desc,
|
|
||||||
'requires_refresh' => true,
|
|
||||||
'callback' => function() use ( $generate_item_return ) {
|
|
||||||
$this->initiate_regeneration_from_tools_page();
|
|
||||||
return $generate_item_return;
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
if ( $lookup_table_exists ) {
|
$entry = array(
|
||||||
$entry['selector'] = array(
|
'name' => __( 'Regenerate the product attributes lookup table', 'woocommerce' ),
|
||||||
|
'desc' => __( 'This tool will regenerate the product attributes lookup table data from existing product(s) data. This process may take a while.', 'woocommerce' ),
|
||||||
|
'requires_refresh' => true,
|
||||||
|
'callback' => function() {
|
||||||
|
$this->initiate_regeneration_from_tools_page();
|
||||||
|
return __( 'Product attributes lookup table data is regenerating', 'woocommerce' );
|
||||||
|
|
||||||
|
},
|
||||||
|
'selector' => array(
|
||||||
'description' => __( 'Select a product to regenerate the data for, or leave empty for a full table regeneration:', 'woocommerce' ),
|
'description' => __( 'Select a product to regenerate the data for, or leave empty for a full table regeneration:', 'woocommerce' ),
|
||||||
'class' => 'wc-product-search',
|
'class' => 'wc-product-search',
|
||||||
'search_action' => 'woocommerce_json_search_products',
|
'search_action' => 'woocommerce_json_search_products',
|
||||||
'name' => 'regenerate_product_attribute_lookup_data_product_id',
|
'name' => 'regenerate_product_attribute_lookup_data_product_id',
|
||||||
'placeholder' => esc_attr__( 'Search for a product…', 'woocommerce' ),
|
'placeholder' => esc_attr__( 'Search for a product…', 'woocommerce' ),
|
||||||
);
|
),
|
||||||
}
|
);
|
||||||
|
|
||||||
if ( $generation_is_in_progress ) {
|
if ( $generation_is_in_progress ) {
|
||||||
$entry['button'] = sprintf(
|
$entry['button'] = sprintf(
|
||||||
/* translators: %d: How many products have been processed so far. */
|
/* translators: %d: How many products have been processed so far. */
|
||||||
__( 'Filling in progress (%d)', 'woocommerce' ),
|
__( 'Filling in progress (%d)', 'woocommerce' ),
|
||||||
get_option( 'woocommerce_attribute_lookup_last_products_page_processed', 0 ) * self::PRODUCTS_PER_GENERATION_STEP
|
get_option( 'woocommerce_attribute_lookup_processed_count', 0 )
|
||||||
);
|
);
|
||||||
$entry['disabled'] = true;
|
$entry['disabled'] = true;
|
||||||
} else {
|
} else {
|
||||||
$entry['button'] = $generate_item_button;
|
$entry['button'] = __( 'Regenerate', 'woocommerce' );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$tools_array['regenerate_product_attributes_lookup_table'] = $entry;
|
$tools_array['regenerate_product_attributes_lookup_table'] = $entry;
|
||||||
|
|
||||||
if ( $lookup_table_exists ) {
|
|
||||||
|
|
||||||
// Delete the table.
|
|
||||||
|
|
||||||
$tools_array['delete_product_attributes_lookup_table'] = array(
|
|
||||||
'name' => __( 'Delete the product attributes lookup table', 'woocommerce' ),
|
|
||||||
'desc' => sprintf(
|
|
||||||
'<strong class="red">%1$s</strong> %2$s',
|
|
||||||
__( 'Note:', 'woocommerce' ),
|
|
||||||
__( 'This will delete the product attributes lookup table. You can create it again with the "Create and fill product attributes lookup table" tool.', 'woocommerce' )
|
|
||||||
),
|
|
||||||
'button' => __( 'Delete', 'woocommerce' ),
|
|
||||||
'requires_refresh' => true,
|
|
||||||
'callback' => function () {
|
|
||||||
$this->delete_all_attributes_lookup_data();
|
|
||||||
return __( 'Product attributes lookup table has been deleted.', 'woocommerce' );
|
|
||||||
},
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tools_array;
|
return $tools_array;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -226,17 +226,15 @@ class Filterer {
|
||||||
|
|
||||||
if ( ! empty( $attributes_to_filter_by ) ) {
|
if ( ! empty( $attributes_to_filter_by ) ) {
|
||||||
$and_term_ids = array();
|
$and_term_ids = array();
|
||||||
$or_term_ids = array();
|
|
||||||
|
|
||||||
foreach ( $attributes_to_filter_by as $taxonomy => $data ) {
|
foreach ( $attributes_to_filter_by as $taxonomy => $data ) {
|
||||||
|
if ( 'and' !== $data['query_type'] ) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
$all_terms = get_terms( $taxonomy, array( 'hide_empty' => false ) );
|
$all_terms = get_terms( $taxonomy, array( 'hide_empty' => false ) );
|
||||||
$term_ids_by_slug = wp_list_pluck( $all_terms, 'term_id', 'slug' );
|
$term_ids_by_slug = wp_list_pluck( $all_terms, 'term_id', 'slug' );
|
||||||
$term_ids_to_filter_by = array_values( array_intersect_key( $term_ids_by_slug, array_flip( $data['terms'] ) ) );
|
$term_ids_to_filter_by = array_values( array_intersect_key( $term_ids_by_slug, array_flip( $data['terms'] ) ) );
|
||||||
if ( 'and' === $data['query_type'] ) {
|
$and_term_ids = array_merge( $and_term_ids, $term_ids_to_filter_by );
|
||||||
$and_term_ids = array_merge( $and_term_ids, $term_ids_to_filter_by );
|
|
||||||
} else {
|
|
||||||
$or_term_ids = array_merge( $or_term_ids, $term_ids_to_filter_by );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $and_term_ids ) ) {
|
if ( ! empty( $and_term_ids ) ) {
|
||||||
|
@ -261,17 +259,6 @@ class Filterer {
|
||||||
AND term_id in {$term_ids_list}
|
AND term_id in {$term_ids_list}
|
||||||
) temp )";
|
) temp )";
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( ! empty( $or_term_ids ) ) {
|
|
||||||
$term_ids_list = '(' . join( ',', $or_term_ids ) . ')';
|
|
||||||
$query['where'] .= "
|
|
||||||
AND product_or_parent_id IN ( SELECT product_or_parent_id FROM (
|
|
||||||
SELECT product_or_parent_id FROM {$this->lookup_table_name}
|
|
||||||
WHERE term_id in {$term_ids_list}
|
|
||||||
{$in_stock_clause}
|
|
||||||
) temp )";
|
|
||||||
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$query['where'] .= $in_stock_clause;
|
$query['where'] .= $in_stock_clause;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ class LookupDataStore {
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
global $wpdb;
|
global $wpdb;
|
||||||
|
|
||||||
$this->lookup_table_name = $wpdb->prefix . 'wc_product_attributes_lookup';
|
$this->lookup_table_name = $wpdb->prefix . 'wc_product_attributes_lookup';
|
||||||
|
|
||||||
$this->init_hooks();
|
$this->init_hooks();
|
||||||
}
|
}
|
||||||
|
@ -84,9 +84,18 @@ class LookupDataStore {
|
||||||
$settings[] = $title_item;
|
$settings[] = $title_item;
|
||||||
|
|
||||||
if ( ! $regeneration_is_in_progress ) {
|
if ( ! $regeneration_is_in_progress ) {
|
||||||
|
$regeneration_aborted_warning =
|
||||||
|
$this->regeneration_was_aborted() ?
|
||||||
|
sprintf(
|
||||||
|
"<p><strong style='color: #E00000'>%s</strong></p><p>%s</p>",
|
||||||
|
__( 'WARNING: The product attributes lookup table regeneration process was aborted.', 'woocommerce' ),
|
||||||
|
__( 'This means that the table is probably in an inconsistent state. It\'s recommended to run a new regeneration process (Status - Tools - Regenerate the product attributes lookup table) before enabling the table usage.', 'woocommerce' )
|
||||||
|
) : null;
|
||||||
|
|
||||||
$settings[] = array(
|
$settings[] = array(
|
||||||
'title' => __( 'Enable table usage', 'woocommerce' ),
|
'title' => __( 'Enable table usage', 'woocommerce' ),
|
||||||
'desc' => __( 'Use the product attributes lookup table for catalog filtering.', 'woocommerce' ),
|
'desc' => __( 'Use the product attributes lookup table for catalog filtering.', 'woocommerce' ),
|
||||||
|
'desc_tip' => $regeneration_aborted_warning,
|
||||||
'id' => 'woocommerce_attribute_lookup_enabled',
|
'id' => 'woocommerce_attribute_lookup_enabled',
|
||||||
'default' => 'no',
|
'default' => 'no',
|
||||||
'type' => 'checkbox',
|
'type' => 'checkbox',
|
||||||
|
@ -648,4 +657,28 @@ class LookupDataStore {
|
||||||
public function unset_regeneration_in_progress_flag() {
|
public function unset_regeneration_in_progress_flag() {
|
||||||
delete_option( 'woocommerce_attribute_lookup_regeneration_in_progress' );
|
delete_option( 'woocommerce_attribute_lookup_regeneration_in_progress' );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a flag indicating that the last lookup table regeneration process started was aborted.
|
||||||
|
*/
|
||||||
|
public function set_regeneration_aborted_flag() {
|
||||||
|
update_option( 'woocommerce_attribute_lookup_regeneration_aborted', 'yes' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove the flag indicating that the last lookup table regeneration process started was aborted.
|
||||||
|
*/
|
||||||
|
public function unset_regeneration_aborted_flag() {
|
||||||
|
delete_option( 'woocommerce_attribute_lookup_regeneration_aborted' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tells if the last lookup table regeneration process started was aborted
|
||||||
|
* (via deleting the 'woocommerce_attribute_lookup_regeneration_in_progress' option).
|
||||||
|
*
|
||||||
|
* @return bool True if the last lookup table regeneration process was aborted.
|
||||||
|
*/
|
||||||
|
public function regeneration_was_aborted(): bool {
|
||||||
|
return 'yes' === get_option( 'woocommerce_attribute_lookup_regeneration_aborted' );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
import { sleep, check, group } from "k6";
|
||||||
|
import http from "k6/http";
|
||||||
|
import { Trend } from "k6/metrics";
|
||||||
|
import { randomIntBetween } from "https://jslib.k6.io/k6-utils/1.1.0/index.js";
|
||||||
|
import {
|
||||||
|
base_url,
|
||||||
|
think_time_min,
|
||||||
|
think_time_max,
|
||||||
|
product_search_term,
|
||||||
|
} from "../../config.js";
|
||||||
|
import {
|
||||||
|
htmlRequestHeader,
|
||||||
|
commonRequestHeaders,
|
||||||
|
commonGetRequestHeaders,
|
||||||
|
commonNonStandardHeaders,
|
||||||
|
} from "../../headers.js";
|
||||||
|
|
||||||
|
// Custom metrics to add to standard results output.
|
||||||
|
let postTypeOrderSearchTrend = new Trend("wc_get_post_type_order_search");
|
||||||
|
|
||||||
|
export function ordersSearch() {
|
||||||
|
let response;
|
||||||
|
|
||||||
|
group("Orders Search", function () {
|
||||||
|
var requestHeaders = Object.assign({},
|
||||||
|
htmlRequestHeader,
|
||||||
|
commonRequestHeaders,
|
||||||
|
commonGetRequestHeaders,
|
||||||
|
commonNonStandardHeaders
|
||||||
|
);
|
||||||
|
|
||||||
|
response = http.get(
|
||||||
|
`${base_url}/wp-admin/edit.php?s=${product_search_term}&` +
|
||||||
|
`post_status=all&post_type=shop_order&action=-1&m=0&_customer_user&` +
|
||||||
|
`paged=1&action2=-1`,
|
||||||
|
{
|
||||||
|
headers: requestHeaders,
|
||||||
|
}
|
||||||
|
);
|
||||||
|
postTypeOrderSearchTrend.add(response.timings.duration);
|
||||||
|
check(response, {
|
||||||
|
"is status 200": (r) => r.status === 200,
|
||||||
|
"body contains: 'Search results' subtitle": (response) =>
|
||||||
|
response.body.includes("Search results for:"),
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
sleep(randomIntBetween(`${think_time_min}`, `${think_time_max}`));
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function () {
|
||||||
|
ordersSearch();
|
||||||
|
}
|
|
@ -13,6 +13,7 @@ import { products } from '../requests/merchant/products.js';
|
||||||
import { addProduct } from '../requests/merchant/add-product.js';
|
import { addProduct } from '../requests/merchant/add-product.js';
|
||||||
import { orders } from '../requests/merchant/orders.js';
|
import { orders } from '../requests/merchant/orders.js';
|
||||||
import { ordersHeartbeat } from '../requests/merchant/orders-heartbeat.js';
|
import { ordersHeartbeat } from '../requests/merchant/orders-heartbeat.js';
|
||||||
|
import { ordersSearch } from '../requests/merchant/orders-search.js';
|
||||||
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
||||||
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
||||||
import { categoryPage } from '../requests/shopper/category-page.js';
|
import { categoryPage } from '../requests/shopper/category-page.js';
|
||||||
|
@ -107,6 +108,7 @@ export function merchantAllFlows() {
|
||||||
myAccountMerchantLogin();
|
myAccountMerchantLogin();
|
||||||
homeWCAdmin();
|
homeWCAdmin();
|
||||||
orders();
|
orders();
|
||||||
|
ordersSearch();
|
||||||
products();
|
products();
|
||||||
addProduct();
|
addProduct();
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import { products } from '../requests/merchant/products.js';
|
||||||
import { addProduct } from '../requests/merchant/add-product.js';
|
import { addProduct } from '../requests/merchant/add-product.js';
|
||||||
import { orders } from '../requests/merchant/orders.js';
|
import { orders } from '../requests/merchant/orders.js';
|
||||||
import { ordersHeartbeat } from '../requests/merchant/orders-heartbeat.js';
|
import { ordersHeartbeat } from '../requests/merchant/orders-heartbeat.js';
|
||||||
|
import { ordersSearch } from '../requests/merchant/orders-search.js';
|
||||||
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
||||||
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
||||||
import { categoryPage } from '../requests/shopper/category-page.js';
|
import { categoryPage } from '../requests/shopper/category-page.js';
|
||||||
|
@ -97,6 +98,7 @@ export function merchantAllFlows() {
|
||||||
myAccountMerchantLogin();
|
myAccountMerchantLogin();
|
||||||
homeWCAdmin();
|
homeWCAdmin();
|
||||||
orders();
|
orders();
|
||||||
|
ordersSearch();
|
||||||
products();
|
products();
|
||||||
addProduct();
|
addProduct();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@ import { wpLogin } from '../requests/merchant/wp-login.js';
|
||||||
import { products } from '../requests/merchant/products.js';
|
import { products } from '../requests/merchant/products.js';
|
||||||
import { addProduct } from '../requests/merchant/add-product.js';
|
import { addProduct } from '../requests/merchant/add-product.js';
|
||||||
import { orders } from '../requests/merchant/orders.js';
|
import { orders } from '../requests/merchant/orders.js';
|
||||||
|
import { ordersSearch } from '../requests/merchant/orders-search.js';
|
||||||
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js';
|
||||||
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js';
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ export function allMerchantFlow() {
|
||||||
wpLogin();
|
wpLogin();
|
||||||
homeWCAdmin();
|
homeWCAdmin();
|
||||||
orders();
|
orders();
|
||||||
|
ordersSearch();
|
||||||
products();
|
products();
|
||||||
addProduct();
|
addProduct();
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
|
|
||||||
// phpcs:ignore Squiz.Commenting.FileComment.Missing
|
// phpcs:ignore Squiz.Commenting.FileComment.Missing
|
||||||
|
|
||||||
|
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore;
|
||||||
|
|
||||||
require_once __DIR__ . '/class-wc-settings-unit-test-case.php';
|
require_once __DIR__ . '/class-wc-settings-unit-test-case.php';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,6 +30,11 @@ class WC_Settings_Products_Test extends WC_Settings_Unit_Test_Case {
|
||||||
'downloadable',
|
'downloadable',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// TODO: Once the lookup table is created in a migration, remove the check and just include 'advanced' in $expected.
|
||||||
|
if ( wc_get_container()->get( LookupDataStore::class )->check_lookup_table_exists() ) {
|
||||||
|
array_push( $expected, 'advanced' );
|
||||||
|
}
|
||||||
|
|
||||||
$this->assertEquals( $expected, $section_names );
|
$this->assertEquals( $expected, $section_names );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,12 +141,12 @@ class WC_Settings_Products_Test extends WC_Settings_Unit_Test_Case {
|
||||||
$settings_ids_and_types = $this->get_ids_and_types( $settings );
|
$settings_ids_and_types = $this->get_ids_and_types( $settings );
|
||||||
|
|
||||||
$expected = array(
|
$expected = array(
|
||||||
'digital_download_options' => array( 'title', 'sectionend' ),
|
'digital_download_options' => array( 'title', 'sectionend' ),
|
||||||
'woocommerce_file_download_method' => 'select',
|
'woocommerce_file_download_method' => 'select',
|
||||||
'woocommerce_downloads_redirect_fallback_allowed' => 'checkbox',
|
'woocommerce_downloads_redirect_fallback_allowed' => 'checkbox',
|
||||||
'woocommerce_downloads_require_login' => 'checkbox',
|
'woocommerce_downloads_require_login' => 'checkbox',
|
||||||
'woocommerce_downloads_grant_access_after_payment' => 'checkbox',
|
'woocommerce_downloads_grant_access_after_payment' => 'checkbox',
|
||||||
'woocommerce_downloads_add_hash_to_filename' => 'checkbox',
|
'woocommerce_downloads_add_hash_to_filename' => 'checkbox',
|
||||||
);
|
);
|
||||||
|
|
||||||
$this->assertEquals( $expected, $settings_ids_and_types );
|
$this->assertEquals( $expected, $settings_ids_and_types );
|
||||||
|
|
|
@ -121,7 +121,7 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
$this->sut->initiate_regeneration();
|
$this->sut->initiate_regeneration();
|
||||||
|
|
||||||
$this->assertEquals( 100, get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
$this->assertEquals( 100, get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
||||||
$this->assertEquals( 0, get_option( 'woocommerce_attribute_lookup_last_products_page_processed' ) );
|
$this->assertEquals( 0, get_option( 'woocommerce_attribute_lookup_processed_count' ) );
|
||||||
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
||||||
|
|
||||||
$expected_enqueued = array(
|
$expected_enqueued = array(
|
||||||
|
@ -156,8 +156,8 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
$this->sut->initiate_regeneration();
|
$this->sut->initiate_regeneration();
|
||||||
|
|
||||||
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
||||||
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_products_page_processed' ) );
|
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_processed_count' ) );
|
||||||
$this->assertEquals( 'no', get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
$this->assertEquals( 'yes', get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
||||||
$this->assertEmpty( $this->queue->get_methods_called() );
|
$this->assertEmpty( $this->queue->get_methods_called() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,15 +165,15 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
* @testdox `initiate_regeneration` processes one chunk of products IDs and enqueues next step if there are more products available.
|
* @testdox `initiate_regeneration` processes one chunk of products IDs and enqueues next step if there are more products available.
|
||||||
*/
|
*/
|
||||||
public function test_initiate_regeneration_correctly_processes_ids_and_enqueues_next_step() {
|
public function test_initiate_regeneration_correctly_processes_ids_and_enqueues_next_step() {
|
||||||
$requested_products_pages = array();
|
$requested_products_offsets = array();
|
||||||
|
|
||||||
$this->register_legacy_proxy_function_mocks(
|
$this->register_legacy_proxy_function_mocks(
|
||||||
array(
|
array(
|
||||||
'wc_get_products' => function( $args ) use ( &$requested_products_pages ) {
|
'wc_get_products' => function( $args ) use ( &$requested_products_offsets ) {
|
||||||
if ( 'DESC' === current( $args['orderby'] ) ) {
|
if ( 'DESC' === current( $args['orderby'] ) ) {
|
||||||
return array( 100 );
|
return array( 100 );
|
||||||
} else {
|
} else {
|
||||||
$requested_products_pages[] = $args['page'];
|
$requested_products_offsets[] = $args['offset'];
|
||||||
return array( 1, 2, 3 );
|
return array( 1, 2, 3 );
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -186,13 +186,13 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
$this->sut->initiate_regeneration();
|
$this->sut->initiate_regeneration();
|
||||||
$this->queue->clear_methods_called();
|
$this->queue->clear_methods_called();
|
||||||
|
|
||||||
update_option( 'woocommerce_attribute_lookup_last_products_page_processed', 7 );
|
update_option( 'woocommerce_attribute_lookup_processed_count', 7 );
|
||||||
|
|
||||||
do_action( 'woocommerce_run_product_attribute_lookup_regeneration_callback' );
|
do_action( 'woocommerce_run_product_attribute_lookup_regeneration_callback' );
|
||||||
|
|
||||||
$this->assertEquals( array( 1, 2, 3 ), $this->lookup_data_store->passed_products );
|
$this->assertEquals( array( 1, 2, 3 ), $this->lookup_data_store->passed_products );
|
||||||
$this->assertEquals( array( 8 ), $requested_products_pages );
|
$this->assertEquals( array( 7 ), $requested_products_offsets );
|
||||||
$this->assertEquals( 8, get_option( 'woocommerce_attribute_lookup_last_products_page_processed' ) );
|
$this->assertEquals( 7 + count( $this->lookup_data_store->passed_products ), get_option( 'woocommerce_attribute_lookup_processed_count' ) );
|
||||||
|
|
||||||
$expected_enqueued = array(
|
$expected_enqueued = array(
|
||||||
'method' => 'schedule_single',
|
'method' => 'schedule_single',
|
||||||
|
@ -205,6 +205,50 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
$this->assertEquals( sort( $expected_enqueued ), sort( $actual_enqueued ) );
|
$this->assertEquals( sort( $expected_enqueued ), sort( $actual_enqueued ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @testDox Products are processed in groups of whatever the 'woocommerce_attribute_lookup_regeneration_step_size' filter returns, defaulting to PRODUCTS_PER_GENERATION_STEP
|
||||||
|
*
|
||||||
|
* @testWith [true]
|
||||||
|
* [false]
|
||||||
|
*
|
||||||
|
* @param bool $set_filter Whether to use the filter to change the processing group size or not.
|
||||||
|
*/
|
||||||
|
public function test_regeneration_uses_the_woocommerce_attribute_lookup_regeneration_step_size_filter( bool $set_filter ) {
|
||||||
|
$requested_step_sizes = array();
|
||||||
|
|
||||||
|
if ( $set_filter ) {
|
||||||
|
\add_filter(
|
||||||
|
'woocommerce_attribute_lookup_regeneration_step_size',
|
||||||
|
function( $default_filter_size ) {
|
||||||
|
return 100;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->register_legacy_proxy_function_mocks(
|
||||||
|
array(
|
||||||
|
'wc_get_products' => function( $args ) use ( &$requested_step_sizes ) {
|
||||||
|
if ( 'DESC' === current( $args['orderby'] ) ) {
|
||||||
|
return array( 100 );
|
||||||
|
} else {
|
||||||
|
$requested_step_sizes[] = $args['limit'];
|
||||||
|
return array( 1, 2, 3 );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->sut->initiate_regeneration();
|
||||||
|
$this->queue->clear_methods_called();
|
||||||
|
|
||||||
|
do_action( 'woocommerce_run_product_attribute_lookup_regeneration_callback' );
|
||||||
|
|
||||||
|
remove_all_filters( ' woocommerce_attribute_lookup_regeneration_step_size' );
|
||||||
|
|
||||||
|
$expected_limit_value = $set_filter ? 100 : DataRegenerator::PRODUCTS_PER_GENERATION_STEP;
|
||||||
|
$this->assertEquals( array( $expected_limit_value ), $requested_step_sizes );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @testdox `initiate_regeneration` finishes regeneration when the max product id is reached or no more products are returned.
|
* @testdox `initiate_regeneration` finishes regeneration when the max product id is reached or no more products are returned.
|
||||||
*
|
*
|
||||||
|
@ -215,15 +259,12 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
* @param array $product_ids The products ids that wc_get_products will return.
|
* @param array $product_ids The products ids that wc_get_products will return.
|
||||||
*/
|
*/
|
||||||
public function test_initiate_regeneration_finishes_when_no_more_products_available( $product_ids ) {
|
public function test_initiate_regeneration_finishes_when_no_more_products_available( $product_ids ) {
|
||||||
$requested_products_pages = array();
|
|
||||||
|
|
||||||
$this->register_legacy_proxy_function_mocks(
|
$this->register_legacy_proxy_function_mocks(
|
||||||
array(
|
array(
|
||||||
'wc_get_products' => function( $args ) use ( &$requested_products_pages, $product_ids ) {
|
'wc_get_products' => function( $args ) use ( &$requested_products_offsets, $product_ids ) {
|
||||||
if ( 'DESC' === current( $args['orderby'] ) ) {
|
if ( 'DESC' === current( $args['orderby'] ) ) {
|
||||||
return array( 100 );
|
return array( 100 );
|
||||||
} else {
|
} else {
|
||||||
$requested_products_pages[] = $args['page'];
|
|
||||||
return $product_ids;
|
return $product_ids;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -237,8 +278,8 @@ class DataRegeneratorTest extends \WC_Unit_Test_Case {
|
||||||
|
|
||||||
$this->assertEquals( $product_ids, $this->lookup_data_store->passed_products );
|
$this->assertEquals( $product_ids, $this->lookup_data_store->passed_products );
|
||||||
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_product_id_to_process' ) );
|
||||||
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_last_products_page_processed' ) );
|
$this->assertFalse( get_option( 'woocommerce_attribute_lookup_processed_count' ) );
|
||||||
$this->assertEquals( 'no', get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
$this->assertEquals( 'yes', get_option( 'woocommerce_attribute_lookup_enabled' ) );
|
||||||
$this->assertEmpty( $this->queue->get_methods_called() );
|
$this->assertEmpty( $this->queue->get_methods_called() );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -545,16 +545,7 @@ class FiltererTest extends \WC_Unit_Test_Case {
|
||||||
$this->assertEmpty( $filtered_product_ids );
|
$this->assertEmpty( $filtered_product_ids );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
||||||
* If a variable product defines an attribute value that isn't used by any variation:
|
|
||||||
* When using the lookup table: that value is not included in the count.
|
|
||||||
* When not using the lookup table: the value is included in the count since it is part of the parent product.
|
|
||||||
*/
|
|
||||||
if ( $using_lookup_table && 'or' === $filter_type && array( 'Green' ) === $attributes ) {
|
|
||||||
$expected_to_be_included_in_count = false;
|
|
||||||
} else {
|
|
||||||
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assert_counters( 'Color', $expected_to_be_included_in_count ? array( 'Blue', 'Red' ) : array(), $filter_type );
|
$this->assert_counters( 'Color', $expected_to_be_included_in_count ? array( 'Blue', 'Red' ) : array(), $filter_type );
|
||||||
}
|
}
|
||||||
|
@ -822,16 +813,7 @@ class FiltererTest extends \WC_Unit_Test_Case {
|
||||||
$this->assertEmpty( $filtered_product_ids );
|
$this->assertEmpty( $filtered_product_ids );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
||||||
* If a variable product defines an attribute value that isn't used by any variation:
|
|
||||||
* When using the lookup table: that value is not included in the count.
|
|
||||||
* When not using the lookup table: the value is included in the count since it is part of the parent product.
|
|
||||||
*/
|
|
||||||
if ( $using_lookup_table && 'or' === $filter_type && array( 'Elastic' ) === $attributes ) {
|
|
||||||
$expected_to_be_included_in_count = false;
|
|
||||||
} else {
|
|
||||||
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
|
||||||
}
|
|
||||||
$this->assert_counters( 'Features', $expected_to_be_included_in_count ? array( 'Washable', 'Ironable' ) : array(), $filter_type );
|
$this->assert_counters( 'Features', $expected_to_be_included_in_count ? array( 'Washable', 'Ironable' ) : array(), $filter_type );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1075,16 +1057,7 @@ class FiltererTest extends \WC_Unit_Test_Case {
|
||||||
$this->assertEmpty( $filtered_product_ids );
|
$this->assertEmpty( $filtered_product_ids );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
$expected_counted_attributes = 'or' === $filter_type || $expected_to_be_visible ? array( 'Blue', 'Red' ) : array();
|
||||||
* If a variable product defines an attribute value that isn't used by any variation:
|
|
||||||
* When using the lookup table: that value is not included in the count.
|
|
||||||
* When not using the lookup table: the value is included in the count since it is part of the parent product.
|
|
||||||
*/
|
|
||||||
if ( $using_lookup_table && 'or' === $filter_type && array( 'Green' ) === $attributes ) {
|
|
||||||
$expected_counted_attributes = array();
|
|
||||||
} else {
|
|
||||||
$expected_counted_attributes = 'or' === $filter_type || $expected_to_be_visible ? array( 'Blue', 'Red' ) : array();
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assert_counters( 'Color', $expected_counted_attributes, $filter_type );
|
$this->assert_counters( 'Color', $expected_counted_attributes, $filter_type );
|
||||||
}
|
}
|
||||||
|
@ -1208,16 +1181,7 @@ class FiltererTest extends \WC_Unit_Test_Case {
|
||||||
$this->assertEmpty( $filtered_product_ids );
|
$this->assertEmpty( $filtered_product_ids );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
||||||
* If a variable product defines an attribute value that isn't used by any variation:
|
|
||||||
* When using the lookup table: that value is not included in the count.
|
|
||||||
* When not using the lookup table: the value is included in the count since it is part of the parent product.
|
|
||||||
*/
|
|
||||||
if ( $using_lookup_table && 'or' === $filter_type && array( 'White' ) === $attributes ) {
|
|
||||||
$expected_to_be_included_in_count = false;
|
|
||||||
} else {
|
|
||||||
$expected_to_be_included_in_count = 'or' === $filter_type || $expected_to_be_visible;
|
|
||||||
}
|
|
||||||
|
|
||||||
$this->assert_counters( 'Color', $expected_to_be_included_in_count ? array( 'Blue', 'Red', 'Green' ) : array(), $filter_type );
|
$this->assert_counters( 'Color', $expected_to_be_included_in_count ? array( 'Blue', 'Red', 'Green' ) : array(), $filter_type );
|
||||||
}
|
}
|
||||||
|
@ -1356,9 +1320,12 @@ class FiltererTest extends \WC_Unit_Test_Case {
|
||||||
wp_set_object_terms( $product_simple_1->get_id(), $terms, 'product_visibility' );
|
wp_set_object_terms( $product_simple_1->get_id(), $terms, 'product_visibility' );
|
||||||
wp_set_object_terms( $product_variable_1['id'], $terms, 'product_visibility' );
|
wp_set_object_terms( $product_variable_1['id'], $terms, 'product_visibility' );
|
||||||
|
|
||||||
$filtered_product_ids = $this->do_product_request( array() );
|
$actual_filtered_product_ids = $this->do_product_request( array() );
|
||||||
|
$expected_filtered_product_ids = array( $product_simple_2->get_id(), $product_variable_2['id'] );
|
||||||
|
sort( $actual_filtered_product_ids );
|
||||||
|
sort( $expected_filtered_product_ids );
|
||||||
|
|
||||||
$this->assertEquals( array( $product_simple_2->get_id(), $product_variable_2['id'] ), $filtered_product_ids );
|
$this->assertEquals( $expected_filtered_product_ids, $actual_filtered_product_ids );
|
||||||
|
|
||||||
$this->assert_counters( 'Color', $expected_colors_included_in_counters );
|
$this->assert_counters( 'Color', $expected_colors_included_in_counters );
|
||||||
$this->assert_counters( 'Features', array( 'Ironable' ) );
|
$this->assert_counters( 'Features', array( 'Ironable' ) );
|
||||||
|
|
|
@ -9,7 +9,6 @@ use Automattic\WooCommerce\Internal\ProductAttributesLookup\DataRegenerator;
|
||||||
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore;
|
use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore;
|
||||||
use Automattic\WooCommerce\Testing\Tools\FakeQueue;
|
use Automattic\WooCommerce\Testing\Tools\FakeQueue;
|
||||||
use Automattic\WooCommerce\Utilities\ArrayUtil;
|
use Automattic\WooCommerce\Utilities\ArrayUtil;
|
||||||
use Automattic\WooCommerce\Testing\Tools\CodeHacking\Hacks\FunctionsMockerHack;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for the LookupDataStore class.
|
* Tests for the LookupDataStore class.
|
||||||
|
@ -36,7 +35,6 @@ class LookupDataStoreTest extends \WC_Unit_Test_Case {
|
||||||
*/
|
*/
|
||||||
public static function tearDownAfterClass() {
|
public static function tearDownAfterClass() {
|
||||||
parent::tearDownAfterClass();
|
parent::tearDownAfterClass();
|
||||||
wc_get_container()->get( DataRegenerator::class )->delete_all_attributes_lookup_data();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -155,6 +155,7 @@ importers:
|
||||||
'@wordpress/jest-preset-default': ^7.1.3
|
'@wordpress/jest-preset-default': ^7.1.3
|
||||||
app-root-path: ^3.0.0
|
app-root-path: ^3.0.0
|
||||||
commander: 4.1.1
|
commander: 4.1.1
|
||||||
|
config: 3.3.3
|
||||||
eslint: ^8.1.0
|
eslint: ^8.1.0
|
||||||
jest: ^25.1.0
|
jest: ^25.1.0
|
||||||
jest-circus: 25.1.0
|
jest-circus: 25.1.0
|
||||||
|
@ -175,6 +176,7 @@ importers:
|
||||||
'@wordpress/jest-preset-default': 7.1.3_@babel+core@7.12.9+jest@25.5.4
|
'@wordpress/jest-preset-default': 7.1.3_@babel+core@7.12.9+jest@25.5.4
|
||||||
app-root-path: 3.0.0
|
app-root-path: 3.0.0
|
||||||
commander: 4.1.1
|
commander: 4.1.1
|
||||||
|
config: 3.3.3
|
||||||
jest: 25.5.4
|
jest: 25.5.4
|
||||||
jest-circus: 25.1.0
|
jest-circus: 25.1.0
|
||||||
jest-each: 25.5.0
|
jest-each: 25.5.0
|
||||||
|
|
Loading…
Reference in New Issue