Edit File by line
/home/zeestwma/richards.../wp-conte.../plugins/woocomme.../src/Admin/API
File: ProductVariations.php
<?php
[0] Fix | Delete
/**
[1] Fix | Delete
* REST API Product Variations Controller
[2] Fix | Delete
*
[3] Fix | Delete
* Handles requests to /products/variations.
[4] Fix | Delete
*/
[5] Fix | Delete
[6] Fix | Delete
namespace Automattic\WooCommerce\Admin\API;
[7] Fix | Delete
[8] Fix | Delete
use Automattic\WooCommerce\Enums\ProductType;
[9] Fix | Delete
[10] Fix | Delete
defined( 'ABSPATH' ) || exit;
[11] Fix | Delete
[12] Fix | Delete
/**
[13] Fix | Delete
* Product variations controller.
[14] Fix | Delete
*
[15] Fix | Delete
* @internal
[16] Fix | Delete
* @extends WC_REST_Product_Variations_Controller
[17] Fix | Delete
*/
[18] Fix | Delete
class ProductVariations extends \WC_REST_Product_Variations_Controller {
[19] Fix | Delete
/**
[20] Fix | Delete
* Endpoint namespace.
[21] Fix | Delete
*
[22] Fix | Delete
* @var string
[23] Fix | Delete
*/
[24] Fix | Delete
protected $namespace = 'wc-analytics';
[25] Fix | Delete
[26] Fix | Delete
/**
[27] Fix | Delete
* Register the routes for products.
[28] Fix | Delete
*/
[29] Fix | Delete
public function register_routes() {
[30] Fix | Delete
parent::register_routes();
[31] Fix | Delete
[32] Fix | Delete
// Add a route for listing variations without specifying the parent product ID.
[33] Fix | Delete
register_rest_route(
[34] Fix | Delete
$this->namespace,
[35] Fix | Delete
'/variations',
[36] Fix | Delete
array(
[37] Fix | Delete
array(
[38] Fix | Delete
'methods' => \WP_REST_Server::READABLE,
[39] Fix | Delete
'callback' => array( $this, 'get_items' ),
[40] Fix | Delete
'permission_callback' => array( $this, 'get_items_permissions_check' ),
[41] Fix | Delete
'args' => $this->get_collection_params(),
[42] Fix | Delete
),
[43] Fix | Delete
'schema' => array( $this, 'get_public_item_schema' ),
[44] Fix | Delete
)
[45] Fix | Delete
);
[46] Fix | Delete
}
[47] Fix | Delete
[48] Fix | Delete
/**
[49] Fix | Delete
* Get the query params for collections.
[50] Fix | Delete
*
[51] Fix | Delete
* @return array
[52] Fix | Delete
*/
[53] Fix | Delete
public function get_collection_params() {
[54] Fix | Delete
$params = parent::get_collection_params();
[55] Fix | Delete
$params['search'] = array(
[56] Fix | Delete
'description' => __( 'Search by similar product name, sku, or attribute value.', 'woocommerce' ),
[57] Fix | Delete
'type' => 'string',
[58] Fix | Delete
'validate_callback' => 'rest_validate_request_arg',
[59] Fix | Delete
);
[60] Fix | Delete
return $params;
[61] Fix | Delete
}
[62] Fix | Delete
[63] Fix | Delete
/**
[64] Fix | Delete
* Add in conditional search filters for variations.
[65] Fix | Delete
*
[66] Fix | Delete
* @internal
[67] Fix | Delete
* @param string $where Where clause used to search posts.
[68] Fix | Delete
* @param object $wp_query WP_Query object.
[69] Fix | Delete
* @return string
[70] Fix | Delete
*/
[71] Fix | Delete
public static function add_wp_query_filter( $where, $wp_query ) {
[72] Fix | Delete
global $wpdb;
[73] Fix | Delete
[74] Fix | Delete
$search = $wp_query->get( 'search' );
[75] Fix | Delete
if ( $search ) {
[76] Fix | Delete
$like = '%' . $wpdb->esc_like( $search ) . '%';
[77] Fix | Delete
$conditions = array(
[78] Fix | Delete
$wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
[79] Fix | Delete
$wpdb->prepare( 'attr_search_meta.meta_value LIKE %s', $like ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared
[80] Fix | Delete
);
[81] Fix | Delete
[82] Fix | Delete
if ( wc_product_sku_enabled() ) {
[83] Fix | Delete
$conditions[] = $wpdb->prepare( 'wc_product_meta_lookup.sku LIKE %s', $like );
[84] Fix | Delete
}
[85] Fix | Delete
[86] Fix | Delete
$where .= ' AND (' . implode( ' OR ', $conditions ) . ')';
[87] Fix | Delete
}
[88] Fix | Delete
[89] Fix | Delete
return $where;
[90] Fix | Delete
}
[91] Fix | Delete
[92] Fix | Delete
/**
[93] Fix | Delete
* Join posts meta tables when variation search query is present.
[94] Fix | Delete
*
[95] Fix | Delete
* @internal
[96] Fix | Delete
* @param string $join Join clause used to search posts.
[97] Fix | Delete
* @param object $wp_query WP_Query object.
[98] Fix | Delete
* @return string
[99] Fix | Delete
*/
[100] Fix | Delete
public static function add_wp_query_join( $join, $wp_query ) {
[101] Fix | Delete
global $wpdb;
[102] Fix | Delete
[103] Fix | Delete
$search = $wp_query->get( 'search' );
[104] Fix | Delete
if ( $search ) {
[105] Fix | Delete
$join .= " LEFT JOIN {$wpdb->postmeta} AS attr_search_meta
[106] Fix | Delete
ON {$wpdb->posts}.ID = attr_search_meta.post_id
[107] Fix | Delete
AND attr_search_meta.meta_key LIKE 'attribute_%' ";
[108] Fix | Delete
}
[109] Fix | Delete
[110] Fix | Delete
if ( wc_product_sku_enabled() && ! strstr( $join, 'wc_product_meta_lookup' ) ) {
[111] Fix | Delete
$join .= " LEFT JOIN {$wpdb->wc_product_meta_lookup} wc_product_meta_lookup
[112] Fix | Delete
ON $wpdb->posts.ID = wc_product_meta_lookup.product_id ";
[113] Fix | Delete
}
[114] Fix | Delete
[115] Fix | Delete
return $join;
[116] Fix | Delete
}
[117] Fix | Delete
[118] Fix | Delete
/**
[119] Fix | Delete
* Add product name and sku filtering to the WC API.
[120] Fix | Delete
*
[121] Fix | Delete
* @param WP_REST_Request $request Request data.
[122] Fix | Delete
* @return array
[123] Fix | Delete
*/
[124] Fix | Delete
protected function prepare_objects_query( $request ) {
[125] Fix | Delete
$args = parent::prepare_objects_query( $request );
[126] Fix | Delete
[127] Fix | Delete
if ( ! empty( $request['search'] ) ) {
[128] Fix | Delete
$args['search'] = $request['search'];
[129] Fix | Delete
unset( $args['s'] );
[130] Fix | Delete
}
[131] Fix | Delete
[132] Fix | Delete
// Retrieve variations without specifying a parent product.
[133] Fix | Delete
if ( "/{$this->namespace}/variations" === $request->get_route() ) {
[134] Fix | Delete
unset( $args['post_parent'] );
[135] Fix | Delete
}
[136] Fix | Delete
[137] Fix | Delete
return $args;
[138] Fix | Delete
}
[139] Fix | Delete
[140] Fix | Delete
/**
[141] Fix | Delete
* Get a collection of posts and add the post title filter option to WP_Query.
[142] Fix | Delete
*
[143] Fix | Delete
* @param WP_REST_Request $request Full details about the request.
[144] Fix | Delete
* @return WP_Error|WP_REST_Response
[145] Fix | Delete
*/
[146] Fix | Delete
public function get_items( $request ) {
[147] Fix | Delete
add_filter( 'posts_where', array( __CLASS__, 'add_wp_query_filter' ), 10, 2 );
[148] Fix | Delete
add_filter( 'posts_join', array( __CLASS__, 'add_wp_query_join' ), 10, 2 );
[149] Fix | Delete
add_filter( 'posts_groupby', array( 'Automattic\WooCommerce\Admin\API\Products', 'add_wp_query_group_by' ), 10, 2 );
[150] Fix | Delete
$response = parent::get_items( $request );
[151] Fix | Delete
remove_filter( 'posts_where', array( __CLASS__, 'add_wp_query_filter' ), 10 );
[152] Fix | Delete
remove_filter( 'posts_join', array( __CLASS__, 'add_wp_query_join' ), 10 );
[153] Fix | Delete
remove_filter( 'posts_groupby', array( 'Automattic\WooCommerce\Admin\API\Products', 'add_wp_query_group_by' ), 10 );
[154] Fix | Delete
return $response;
[155] Fix | Delete
}
[156] Fix | Delete
[157] Fix | Delete
/**
[158] Fix | Delete
* Get the Product's schema, conforming to JSON Schema.
[159] Fix | Delete
*
[160] Fix | Delete
* @return array
[161] Fix | Delete
*/
[162] Fix | Delete
public function get_item_schema() {
[163] Fix | Delete
$schema = parent::get_item_schema();
[164] Fix | Delete
[165] Fix | Delete
$schema['properties']['name'] = array(
[166] Fix | Delete
'description' => __( 'Product parent name.', 'woocommerce' ),
[167] Fix | Delete
'type' => 'string',
[168] Fix | Delete
'context' => array( 'view', 'edit' ),
[169] Fix | Delete
);
[170] Fix | Delete
$schema['properties']['type'] = array(
[171] Fix | Delete
'description' => __( 'Product type.', 'woocommerce' ),
[172] Fix | Delete
'type' => 'string',
[173] Fix | Delete
'default' => ProductType::VARIATION,
[174] Fix | Delete
'enum' => array( ProductType::VARIATION ),
[175] Fix | Delete
'context' => array( 'view', 'edit' ),
[176] Fix | Delete
);
[177] Fix | Delete
$schema['properties']['parent_id'] = array(
[178] Fix | Delete
'description' => __( 'Product parent ID.', 'woocommerce' ),
[179] Fix | Delete
'type' => 'integer',
[180] Fix | Delete
'context' => array( 'view', 'edit' ),
[181] Fix | Delete
);
[182] Fix | Delete
[183] Fix | Delete
return $schema;
[184] Fix | Delete
}
[185] Fix | Delete
[186] Fix | Delete
/**
[187] Fix | Delete
* Prepare a single variation output for response.
[188] Fix | Delete
*
[189] Fix | Delete
* @param WC_Data $object Object data.
[190] Fix | Delete
* @param WP_REST_Request $request Request object.
[191] Fix | Delete
* @return WP_REST_Response
[192] Fix | Delete
*/
[193] Fix | Delete
public function prepare_object_for_response( $object, $request ) {
[194] Fix | Delete
$context = empty( $request['context'] ) ? 'view' : $request['context'];
[195] Fix | Delete
$response = parent::prepare_object_for_response( $object, $request );
[196] Fix | Delete
$data = $response->get_data();
[197] Fix | Delete
[198] Fix | Delete
$data['name'] = $object->get_name( $context );
[199] Fix | Delete
$data['type'] = $object->get_type();
[200] Fix | Delete
$data['parent_id'] = $object->get_parent_id( $context );
[201] Fix | Delete
[202] Fix | Delete
$response->set_data( $data );
[203] Fix | Delete
[204] Fix | Delete
return $response;
[205] Fix | Delete
}
[206] Fix | Delete
}
[207] Fix | Delete
[208] Fix | Delete
It is recommended that you Edit text format, this type of Fix handles quite a lot in one request
Function