Order metadata when retrieving via get_metadata() (4 posts)

  1. robahas
    Posted 3 years ago #

    Hi -

    I'm probably pushing this functionality beyond what it was intended, but my customer wants to upload CSV product tables and then have that data listed in posts. There are hundreds of these spreadsheets. I've got this all working using post metadata, but when I generate the metadata for a post using get_metadata() it comes back in "random order" (not clear what controls it). I was assuming/hoping it would list the metadata in the order that it was inputted - ie, the meta key value, which is also the order of my spreadsheet. Unfortunately it doesn't. I guess I could get around this by doing a direct database query, but was hoping to just use the WP functions as that is how I have it all set up now.

    Another idea is to order the csv columns by placing numbers in front of them and then ordering the metadata array by that and stripping them for output. But that is kind of time consuming given the number of spreadsheets involved and not very elegant either.

    Note that the spreadsheets have different column names, so I can't call up the metadata by name, which would also solve the problem. It has to generate the entire list and spit out the value - key pair.

    Well, if I don't hear any ideas I'll just go with the direct database query and order the results by metadata key.

    Any thoughts on this?

  2. Shaun Scovil
    Posted 3 years ago #

    Hi there,

    Using post meta is definitely not the best solution for this. You cannot currently control the order in which it is returned...I am having a similar problem with a plugin I'm developing.

    For your client's needs, consider my plugin: http://wordpress.org/extend/plugins/csv-to-sorttable/

    I'm working on a newer version that is more feature-rich, but this one should do the trick.



  3. robahas
    Posted 3 years ago #

    Thanks Shaun - That's a great idea and I will keep track of your plugin. For this project I'm already on another path. I've made my plugin to take the csv from an import and automatically create a post from each line. Ordering by the meta_id worked great, BTW, but I had to do a $wpdb query. I'll paste it here in case anyone else can use it in the future:

    global $wpdb;
    $this_post = get_the_ID();
    $sql = "SELECT * FROM wp_postmeta WHERE post_id = $this_post ORDER BY meta_id";
    $meta = $wpdb->get_results( $sql );
    foreach ( $meta as $row ) {
        echo $row->meta_key; // Do fun thing here
  4. Shaun Scovil
    Posted 3 years ago #

    Glad you were able to get it working. I would urge you to reconsider -- not because I'm trying to push my plugin, but because your current solution does a few undesirable things:

    1. Fills up the database with data that is already stored neatly in a CSV file.
    2. Runs an SQL query to display data, which slows things down.
    3. Makes your 'posts' unusable in the future, since it doesn't appear you're using a custom post type.

    Each of those things seem unnecessary. If it is the route you decide to go, however, consider creating a custom post type for table data and using WP_Query instead of $wpdb.

Topic Closed

This topic has been closed to new replies.

About this Topic