Skip to content

Instantly share code, notes, and snippets.

@searchwpgists
Created March 9, 2022 14:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save searchwpgists/48cdaab0f3d3734ac0a073beb5ae3b75 to your computer and use it in GitHub Desktop.
Save searchwpgists/48cdaab0f3d3734ac0a073beb5ae3b75 to your computer and use it in GitHub Desktop.
Tell SearchWP to parse WooCommerce Downloadable Product downloads for document content
<?php
// Tell SearchWP to parse WooCommerce Downloadable Product downloads for document content.
// The content will be extracted from downloadable documents where possible and stored
// in SearchWP's index as a Custom Field with a label of "SearchWP WooCommerce Download Content"
add_filter( 'searchwp\entry\data', function( $data, \SearchWP\Entry $entry ) {
if ( 'post.product' !== $entry->get_source()->get_name() || ! class_exists( 'WC_Product' ) ) {
return $data;
}
$product = new \WC_Product( $entry->get_id() );
$downloads = $product->get_downloads();
if ( empty( $downloads ) ) {
return $data;
}
// WooCommerce only stores a hashed ID, the filename, and the URL to the file
// but we need to retrieve the Media library ID for each downloadble file.
$download_content = [];
$upload_dir = wp_upload_dir();
foreach ( $downloads as $key => $download ) {
$relative_file_location = str_replace( trailingslashit( $upload_dir['baseurl'] ), '', $download['data']['file'] );
// We can use the relative file location to retrieve the post ID we need to parse the PDFs.
$file_id = get_posts( [
'post_type' => 'attachment',
'post_status' => 'inherit',
'fields' => 'ids',
'meta_query' => [ [
'key' => '_wp_attached_file',
'value' => $relative_file_location,
], ],
] );
if ( ! empty( $file_id ) ) {
$download_content[] = \SearchWP\Document::get_content( get_post( $file_id[0] ) );
}
}
$data['meta']['swp_wc_doc_content'] = \SearchWP\Utils::tokenize( $download_content );
return $data;
}, 20, 2 );
// Add "SearchWP WooCommerce Download Content" as available option.
add_filter( 'searchwp\source\attribute\options', function( $keys, $args ) {
if ( $args['attribute'] !== 'meta' ) {
return $keys;
}
$content_key = 'swp_wc_doc_content';
if ( ! in_array(
$content_key,
array_map( function( $option ) { return $option->get_value(); }, $keys )
) ) {
$keys[] = new \SearchWP\Option( $content_key, 'SearchWP WooCommerce Download Content' );
}
return $keys;
}, 20, 2 );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment