Skip to content

Instantly share code, notes, and snippets.

@MogulChris
Created November 23, 2020 04:00
Show Gist options
  • Select an option

  • Save MogulChris/e753bb4d76c873c20d12afea15f6b6aa to your computer and use it in GitHub Desktop.

Select an option

Save MogulChris/e753bb4d76c873c20d12afea15f6b6aa to your computer and use it in GitHub Desktop.

Revisions

  1. MogulChris created this gist Nov 23, 2020.
    129 changes: 129 additions & 0 deletions theme-elasticsearch.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,129 @@
    //Search fields indexed by post type. Yes, I should do this in a tidier way.
    global $search_index_fields;
    $search_index_fields = array(
    'still_image' => array('people','business','location','format_original','author','notes'),
    'audio' => array('people','business','transcript','format_original','author','additional'),
    'video' => array('people','business','format_original','transcript','author','additional'),
    'person' => array('name','known_as','maiden_name','military_identification','birthplace','parents','partner','children','deathplace','biography'),
    'text' => array('people','business','location','format_original','author','notes','publisher','transcript')
    );

    //This function returns our full list of meta fields
    //It either returns a plain array of raw meta keys, or the same meta keys but formatted like meta.[key].value
    function kb_get_search_fields($raw = false){

    global $search_index_fields;

    $all_fields = ['post_title'];

    foreach($search_index_fields as $post_type => $fields){
    foreach($fields as $field){
    $key = "meta.$field.value";
    if(!in_array($key,$all_fields)) $all_fields[] = ($raw ? $field : $key);
    }
    }

    return $all_fields;
    }

    //Add fields to the plugin UI
    function knowledgebank_add_custom_field_elasticpress_weighting( $fields, $post_type ) {

    if(in_array($post_type,['still_image','audio','video','person','text'])){
    $fields['meta'] = array(
    'label' => 'Custom Fields',
    'children' => array(),
    );

    global $search_index_fields;

    foreach($search_index_fields[$post_type] as $field){ //
    // Change my_custom_field here to what you need.
    $key = 'meta.' . $field;

    $fields['meta']['children'][ $key ] = array(
    'key' => $key,
    'label' => ucwords($field),
    );
    }

    }

    return $fields;
    }
    add_filter('ep_weighting_fields_for_post_type','knowledgebank_add_custom_field_elasticpress_weighting', 10, 2);

    //Prepare fancier meta
    function knowledgebank_ep_prepare_meta_data($meta,$post){

    global $search_index_fields;

    $search_fields = kb_get_search_fields(true);
    foreach($meta as $key => $value){
    if(!in_array($key, $search_fields)) unset($meta[$key]);
    }

    //$transcript = get_field('transcript', $post->ID);
    //$meta['transcript'] = array($transcript);

    //name fields are repeaters, each row having first, middle, surname and (possibly) a reference field to a person record
    foreach(['people','author','partner','children','parents'] as $name_field){
    $people = get_field($name_field, $post->ID);
    if(!empty($people)){
    //get an array of names - we can easily do this by stripping the reference field on each row and imploding the remaining name fields
    $names = array_map(function($person){
    if(!empty($person['record'])) unset($person['record']);
    return implode(' ',$person);
    },$people);

    if(!empty($names)) $meta[$name_field] = implode(', ',$names); //eg John Smith, Rosie Jones, Derek Green
    }
    }

    // print_r(array_keys($meta));
    // global $wpdb;
    // $wpdb->query('DELETE FROM wp_options WHERE option_name LIKE "%wpcli_sync%"');
    // exit;

    return $meta;
    }
    add_filter( 'ep_prepare_meta_data', 'knowledgebank_ep_prepare_meta_data',1,2);

    //Search everything we index
    function knowledgebank_ep_search_fields($search_fields, $args){
    return kb_get_search_fields();
    }
    add_filter( 'ep_search_fields', 'knowledgebank_ep_search_fields',10,2);


    //Which post types you want to index - presumably overrides the UI options... not 100% sure if needed
    function knowledgebank_ep_indexable_post_types($types){
    global $search_index_fields;
    return array_keys($search_index_fields);
    }
    add_filter('ep_indexable_post_types','knowledgebank_ep_indexable_post_types');


    //The one hook to rule them all - fully modify the query data which is to be posted to the server as JSON (still PHP at this stage)
    function knowledgebank_ep_formatted_args( $formatted_args, $args ) {
    if (
    ! empty( $formatted_args['query']['bool']['should'] ) &&
    is_array( $formatted_args['query']['bool']['should'] )
    ) {
    global $search_index_fields;
    $all_fields = kb_get_search_fields();
    $simple_query = array(
    'simple_query_string' => array(
    'query' => $formatted_args['query']['bool']['should'][0]['multi_match']['query'],
    'fields' => $all_fields,
    'default_operator' => 'AND',
    'flags' => 'ALL'
    )
    );

    $formatted_args['query']['bool']['should'] = array($simple_query);

    }
    return $formatted_args;
    }
    add_filter( 'ep_formatted_args', 'knowledgebank_ep_formatted_args', 10, 2 );