Support

Account

Forum Replies Created

  • Hi john,

    I am still having troubles executing the queries, since apparently quering meta keys by 5+ meta_keys at once takes up a lot of resources.


    @hube2
    – My question: would it be better to use taxonomies for these type of filtering?

    Thanks in advance,

    Martijn

  • as I am not able to edit my previous post.
    Please note: The meta_key has to be different than your ACF field name.

  • In case somebody faces the same problems as I did.

    For getting the selection field and post its values as meta data:

    // Credits: John Heubner
    // create a function that will convert this repeater during the acf/save_post action
    // priority of 20 to run after ACF is done saving the new values
    add_filter('acf/save_post', 'convert_color_to_standard_wp_meta', 20);
     
    function convert_color_to_standard_wp_meta($post_id) {
    
      // pick a new meta_key to hold the values of the color field
      // I generally name this field by suffixing _wp to the field name
      // as this makes it easy for me to remember this field name
      // also note, that this is not an ACF field and will not
      // appear when editing posts, it is just a db field that we
      // will use for searching
      $meta_key = 'watch_functions';
       
      // the next step is to delete any values already stored
      // so that we can update it with new values
      // and we don't need to worry about removing a value
      // when it's deleted from the ACF repeater
      delete_post_meta($post_id, $meta_key);
       
      // create an array to hold values that are already added
      // this way we won't add the same meta value more than once
      // because having the same value to search and filter by
      // would be pointless
      $saved_values = array();
    
      $functions = get_field('functies');
    
      if(!empty($functions))
      {
        foreach($functions as $function)
        {
           
          // see if this value has already been saved
          // note that I am using isset rather than in_array
          // the reason for this is that isset is faster than in_array
          if (isset($saved_values[$function])) {
            // no need to save this one we already have it
            continue;
          }
           
          // not already save, so add it using add_post_meta()
          // note that we are using false for the 4th parameter
          // this means that this meta key is not unique
          // and can have more then one value
          add_post_meta($post_id, $meta_key, $function, false);
           
          // add it to the values we've already saved
          $saved_values[$function] = $function;
    
        } // end while have rows
      } // end if have rows
    } // end function

    And quering the database.

    $posts = get_posts(array(
                  'numberposts' => -1,
                  'post_type'   => 'watch',
                  'posts_per_page'  => 100,
                  'meta_key'      => 'score',
                  'orderby'     => 'meta_value',
                  'order'       => 'DESC',
                  'meta_query'  => array(
                    array(
                      'relation'    => 'AND',
                      array(
                        'key'       => 'watch_functions',
                        'compare'   => '=',
                        'compare'   => 'calorieenteller',
                      )
                    )
                  ),
                ));

    Cheers,

    Martijn

  • Hi John,

    Got it! Will use the post_meta_data method:)
    I’ll post my edited code here when finished!

    Many thanks,

    Martijn

  • Hi John,

    Thanks for your answer and pointing me to your blog article. You explain it in a very simple way. You are definitely right.

    One questions though.
    Do you know if I create a “normal” true false checkbox the values will be saved as post_meta_data?
    Otherwise I will tweak your “repeater code” for my multiselect.

    What would you advise?

    Thanks,

    Martijn

Viewing 5 posts - 1 through 5 (of 5 total)