jenny
  • 0
Новичок

Запросить и получить метаданные как объект (stdClass) в таблице postmeta wp?

  • 0

Я хочу получить группы данных из таблицы postmeta. Таблица postmeta имеет 4 столбца: meta_id, post_id, meta_key, meta_value. Каждый post_id имеет список meta_keys. Я хочу запустить запрос и получить результат

arry(number of results)(
                      [0]=>object(stdClass)#1(
                                             [post_id] => 123,
                                             [key1]    => x,
                                             [key2]    => y,
                                             [key3]    => z
                                             )
                      [1]=>=>object(stdClass)#2(
                                             [post_id] => 456,
                                             [key1]    => x,
                                             [key2]    => y,
                                             [key3]    => z
                                             )
                      )

Как это сделать?

Share
  1. Вы хотите сделать это для ограниченного числа сообщений или для (почти) всех сообщений? (Разница между использованием функций мета API WP и пользовательским запросом). А что, если пост имеет несколько мета-значений для одного и того же ключа? Переписать последним? (Используйте @Jan, когда вы отвечаете в комментарии, и я получаю уведомление)

    • 0
    • @Jan, я хочу получить идентификаторы всех сообщений, а также мета_ключ и мета_значения, которые принадлежат каждому идентификатору сообщения. Объект представляет собой график, созданный плагином, он берет информацию из настраиваемых входных полей, вычисляет в классе. Теперь мне нужно прокрутить весь график, чтобы я мог отображать график для каждого поста — это то, чему я научился — зацикливать и отображать. Если я не ошибся, мне нужно зациклить весь график отдельно от пост-цикла. Я позаимствовал код цикла, чтобы выполнить задание, теперь нужно ввести объект в код цикла. Вот почему нужен формиат, как указано выше. Любое предложение? Спасибо!

      • 0
    • Каждый мета_ключ и значение уникальны. Проверка выполняется при сохранении входных данных в настраиваемое поле.

      • 0
    • @Jan Fabry, если вы считаете, что есть другой лучший способ отображения графиков, предложите.

      • 0
  2. Недавно мне было интересно то же самое, и это лучшее решение, которое я придумал.

    Во-первых, объявите действительно простой класс в файле functions.php.

    class Object
    {
        var $data = array();
    
        public function __set($name, $value)
        {
            $this->data[$name] = $value;
        }
    
        public function __get($name)
        {
            return $this->data[$name];
        }
    }
    

    Это общий объект, который мы будем использовать для хранения всего

    Далее мы подключимся к базе данных SQL и извлечем все необходимые нам данные. В этом случае я делаю очень общий запрос, чтобы выбрать ВСЕ сообщения в базе данных и прикрепить соответствующие данные. Если у вас большая БД, вам, вероятно, нужно немного сузить этот запрос с некоторыми условиями в сообщении, такими как добавление:

    "WHERE post.post_type = 'graph'"
    

    к SQL-запросу, но я не уверен, что именно вы сужаете результаты, поэтому мы останемся общими для демонстрационных целей…

    global $wpdb;
        $query = "SELECT post.id as post_id, meta.meta_key, meta.meta_value FROM wp_posts as post LEFT JOIN wp_postmeta as meta ON post.id = meta.post_id";
        $result = $wpdb->get_results($query);
        $last_post_id = -1;
        $object_array = array();
        foreach($result as $post)
        {
            if ($last_post_id != $post->post_id)
            {
                $instance = new Object;
                $last_post_id = $post->post_id;
                $instance->post_id = $post->post_id;
    
                $instance->{$post->meta_key} = $post->meta_value;
                $object_array[] = $instance;
            }
            else {
                $meta_key = $post->meta_key;
                $instance->$meta_key = $post->meta_value;
            }
        }
    

    Что это делает, так это берет относительно «грязный» запрос из sql и организует его в формате, который вы упомянули выше. наконец, попробуйте распечатать массив для себя

    print_r($object_array);
    

    Вы заметите, что ваши переменные встроены в другой массив «данных» внутри объекта, но из-за функций получения и установки, которые мы написали в определении класса, вы по-прежнему можете напрямую вызывать имена переменных.

    то есть

    $meta_key = "my_key";
    echo $object_array[0]->$meta_key;
    

    Надеюсь, это полезно.

    • 0

Оставить ответ

You must login to add an answer.