Update post meta


  • SOLVED

Hi guys,

My client has a WP site, they have the option to upload & attach a video to a post into a custom field (video_high_resolution_mp4_video) (Actually created by MagicFields2, but this seems to be irrelevant).

I have a script that runs via cron to list all posts, finds all posts with the video_high_resolution_mp4_video custom field set and has an empty second custom field called video_vimeo_id.
The script will then upload video from video_high_resolution_mp4_video to Vimeo via the Vimeo API. This works and I get the Vimeo ID back as a string.

$video_id = $vimeo->upload($video_high_resolution_mp4_video);

I get this back

<blockquote>string(8) "34566961"</blockquote>

But, when I try to update the Vimeo ID into the post with update_post_meta, I get an error.

I'm doing

$foo = update_post_meta(get_the_id(), 'videos_vimeo_id', $video_id);


I am also doing

$foo2 = add_post_meta(get_the_id(), 'video_vimeo_id_callback', $video_id, TRUE);
and
$foo4 = add_post_meta(get_the_id(), 'videos_vimeo_id_upload_date', date(r), TRUE);

to prove its not a MagicFields issue, as video_vimeo_id_callback and videos_vimeo_id_upload_date are just new custom post field I made up.

$foo2 & $foo4 randomly returns false on some posts and not others.

I am testing with

if ($foo2 == FALSE) {
echo 'update_post_meta failed. Deleting video from Vimeo';
$delete_from_vimeo = $vimeo->call('vimeo.videos.delete',$video_id);
}
else {
echo 'update_post_meta succeeded';
}

I can't see any difference in the posts that work and the posts that fail.
Vimeo always returns a valid $video_id to work with.

So, out of a few hundred posts, I get an error on maybe 4 or 5 posts. I've deleted these posts and added them again. Each time update_post_meta and add_post_meta fails.

Watching the MySQL log (I've enabled query logging), it doesn't even do a MySQL query when update_post_meta or add_post_meta fails.
I can't see what WP logic decides not to even query the DB on these two functions.

Incidently, add_post_meta also fails at this point aswell

$foo2 = add_post_meta(get_the_id(), 'video_vimeo_id_callback', $video_id, TRUE);


Has anyone else had issues like this before? Or know whats going on?

Thanks

Update:

Just rewrote the code to test my sanity.

<?php
require_once '../wp-blog-header.php';
require_once 'vimeo.class.php';

$vimeo = new phpVimeo(VIMEO_CONSUMER_KEY, VIMEO_CONSUMER_SECRET, VIMEO_ACCESS_TOKEN, VIMEO_ACCESS_TOKEN_SECRET);
echo '<pre>';print_r($vimeo);echo '</pre>';

$args = array('order' => 'DESC', 'post_type' => array('video_library','post'), 'status' => array('pending','published'), 'posts_per_page' => -1);

if (isset($_GET['id'])) {
$args2 = array('p' => $_GET['id'], 'status' => array('draft','pending','published'));
$args = array_merge($args,$args2);

}

echo '<pre>';print_r($args);echo '</pre>';

$the_query = new WP_Query($args);

// The Loop
while ( $the_query->have_posts() ) : $the_query->the_post();

echo '<br /><strong> ('.$post->ID.') '.get_the_title(). '</strong>';


echo '<br />';

echo 'Post Type: '.get_post_type(get_the_id()).'<br />';

if (get_post_type(get_the_id()) == 'post') {
$video_high_resolution_mp4_video_id = get_post_meta(get_the_id(),'videos_high_resolution_mp4_video', TRUE);
$video_vimeo_id = get('videos_vimeo_id');

}
elseif (get_post_type(get_the_id()) == 'video_library') {
$video_high_resolution_mp4_video_id = get_post_meta(get_the_id(),'video_high_resolution_mp4_video', TRUE);
$video_vimeo_id = get('video_vimeo_id');
}

echo 'Attachment ID: '.$video_high_resolution_mp4_video_id.'<br />';
echo 'Vimeo ID: '.$video_vimeo_id.'<br />';

if (isset($video_high_resolution_mp4_video_id)) {
$video_high_resolution_mp4_video = wp_get_attachment_url($video_high_resolution_mp4_video_id);
echo 'Attachment URL: '.$video_high_resolution_mp4_video.'<br />';
}
else {
'can't get attachment id';
}

// we have no vimeo id
if (empty($video_vimeo_id) AND !empty($video_high_resolution_mp4_video)) {
echo 'No vimeo id for this, but a high res waiting to upload <br />';
echo '**** GOING TO UPLOAD **** <br />';

$video_high_resolution_mp4_video_local = preg_replace(WP_SITEURL_RX,WP_PATH ,$video_high_resolution_mp4_video);
echo 'Local Path: '. $video_high_resolution_mp4_video_local.'<br />';


// do the upload

$video_id = $vimeo->upload($video_high_resolution_mp4_video_local);

// catch errors

//
if (isset($video_id) AND !empty($video_id)) {
echo '** Upload to Vimeo OK! <br />';

// set the info on vimeo
// $vimeo->call('vimeo.videos.setTitle', array('title' => '('.get_the_id().') '.get_the_title(), 'video_id' => $video_id));
// $vimeo->call('vimeo.videos.embed.setPreset', array('preset_id' => VIMEO_PRESET_ID, 'video_id' => $video_id));

// set the wp meta info
$update_post_meta = update_post_meta($post->ID, 'videos_vimeo_id', date('r'), "");
$update_post_meta2 = update_post_meta($post->ID, 'videos_vimeo_id_callback', date('r'), "");
$update_post_meta3 = update_post_meta($post->ID, 'videos_vimeo_id_upload_date', date('r'), "");

if ($update_post_meta == FALSE) {
echo 'update_post_meta failed';
}
else {
echo 'update_post_meta ok';
}
echo ' | ';


if ($update_post_meta2 == FALSE) {
echo 'update_post_meta failed 2';
}
else {
echo 'update_post_meta ok 2';
}
echo ' | ';

if ($update_post_meta3 == FALSE) {
echo 'update_post_meta failed 3';
}
else {
echo 'update_post_meta ok 3';
}

}
else {
echo '** Upload to Vimeo FAILED! <br />';
}

}
else {
echo '<br />Already Vimto'ed';
}

echo '<br /><a href="'.get_bloginfo('url').'/wp-admin/post.php?post='.get_the_id().'&action=edit">Edit post</a>';

echo '<hr />';

endwhile;

?>

$post-ID works and get_the_id() works fine.

I may have found the issue…

When I have this line

$video_id = $vimeo->upload($video_high_resolution_mp4_video_local);

The update_post_meta calls fail.

When I comment the above out and do

$video_id = 44444;

they work.

What makes no sense is that update_post_meta and $video_id are not currently linked together at all in this code.

wpquestions.com

  • viorelepuran

  • March 7, 2018 at 6:19 am

Hello,

I created a front end form, whitch looks like this:

<?php  $new_post = array(  'post_id' => 'new',  'field_groups' => array(57),  'form' => true,  'return' => '%post_url%',  'html_before_fields' => '',  'html_after_fields' => '',  'submit_value' => 'Submit Post',  'updated_message' => 'Saved!'  );  acf_form( $new_post ); ?>  <script type="text/javascript"> jQuery(document).ready(function($) {  var ajaxUrl = "SITE_ADMIN_URL/admin-ajax.php"; 	$(".acf-button").on("click",function(){ // When btn is pressed. 	var selected_model = $("#acf-field-area option:selected").text(); 		if(selected_model ){ 			$.post(ajaxUrl, { 					action:"the_model", 					selected_model: selected_model 	 }); 		}  }); }); </script>

In functions.php i have added the following function:

add_filter('acf/save_post', 'add_car_model', 20);  function add_car_model($post_id) {  $post_type = get_post_type($post_id);  if ($post_type != 'cars') {  // not our post type, bail early  return;  }      $selected_model = $_POST['selected_model'];  add_post_meta($post_id, 'car_model', '');  update_post_meta($post_id, 'car_model', $selected_model);  }  

I have a select dropdown called Make, and based on the make, i am loading values into Model dropdown, which is custom dropdown.

Using javascript, i managed to get the correct model value(tested it using on change and alert();) but i do not know how to pass the model value into the post’s meta data.

Thank you for looking into this!

support.advancedcustomfields.com

Я попробовал ответить Даниэлю, и это не сработало для меня. Возможно, код WordPress / Woocommerce изменился с тех пор, или, может быть, я не совсем понял, как это сделать, но в любом случае этот код ничего не сделал для меня. Однако, после много работы, использующей его в качестве базы, я придумал этот фрагмент кода и поместил его в functions.php моей темы:

При этом я могу взять то, что я установил как «материал» на моей установке WooCommerce как пользовательский атрибут, и добавить его в формальный мета как _материал. Это, в свою очередь, позволяет мне использовать другой фрагмент кода, поэтому функция поиска WooCommerce распространяется на мета-поля, то есть я могу искать материал в поле поиска WooCommerce и отображать все элементы с этим материалом.

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

code.i-harness.com


Несколько записей для одного и того же мета ключа

Теперь элемент, идентифицированный с помощью $item_id будет иметь несколько записей для мета-ключа color


. Затем вы можете использовать get_post_meta() а третий параметр – false и вы получите массив со всеми значениями:

Храните массив в одной мета-записи

В этом случае массив значений сериализуется до того, как он будет создан в базе данных:

Теперь элемент, идентифицированный с помощью $item_id будет иметь только одну запись для мета-ключа color ; значение представляет собой сериализованную строку, представляющую исходный массив. Затем вы можете использовать get_post_meta() , с третьим параметром, get_post_meta() true, поскольку у вас есть только одна запись, а затем unserialize строка для возврата массива:

Вы можете следовать одному и тому же подходу с помощью множественного числа вашей формы.

Имея только одну запись для мета-ключа:

Затем вы можете использовать значение как массив:

С несколькими записями:

Концепция здесь немного отличается; у вас будет несколько записей в базе данных с одним и тем же мета-ключом, поэтому вам нужно будет использовать add_post_meta() вместо update_post_meta() , чтобы добавить новую запись для каждого значения.

Теперь вы можете использовать get_post_meta() а третий параметр – false (это значение по умолчанию, поэтому вы можете его опустить):

Оба варианта в порядке, вы должны решить, какой из них лучше организовать данные в рамках вашего проекта.

Сторона примечания : вы должны выполнить некоторую сантизацию перед использованием входных данных, но я не знаю требований для вас, вот пример:

www.wordpressask.com

Я использую плагин для Woocommerce, который добавляет новый метабокс с редактируемыми полями количества чисел в админ-сервер администратора. Моя тема позволяет публиковать объявления на переднем конце, поэтому я хочу добавить некоторые из этих полей в интерфейс.

мне удалось добавить поля в моем файле шаблон с помощью:

Оба полей отображаются на моей фронтальной форме продукта редактирования и получать их значения из внутреннего интерфейса, если они были ранее заполнены .

Но теперь я борюсь с обновлением и сохранением полей с обновленными значениями от переднего конца или сохранения новых значений из переднего конца, если эти значения не были ранее заполнены.

Я провел часы п inding некоторые учебник по этому вопросу, я думаю, что я должен сосредоточиться на следующем коде:

Но я не могу понять, если это правильно и где должен этот код будет помещен для того, чтобы сохранить или обновить свои поля ,

Я попытался поместить функцию в моей functions.php файл, который выглядит следующим образом:

Но это просто не кажется, чтобы быть победителем.

Не могли бы вы указать мне направление вправо?

Ниже приведен код действительного исходного плагина, который создает метабокс во внутреннем интерфейсе, я не уверен, что он имеет отношение к тому, что мне нужно делать в интерфейсе, а какая часть этого и где я должен быть используя его:

stackoverrun.com

WordPress пытается как можно больше сократить количество запросов к базе данных.

Например, в любое время, когда вы получаете мета-поле или поле таксономии, перед запросом базы данных WordPress выглядит, если это уже запрошено и хранится в кеше, и возвращает его туда вместо запроса в базу данных.

«Задача кэша» выполняется с помощью WP_Object_Cache и wp_cache_* функции (которые являются оберткой для методов этого класса.)

По умолчанию «кеш» — это не что иное, как глобальная переменная PHP. Это означает, что он находится в памяти, но также означает, что он исчезает по каждому запросу.

Однако через dropins (advanced-cache.php и /или object-cache.php)) можно настроить собственный способ обработки этого кеша.

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

По этой причине среди людей WP они известны как плагины «постоянного кэша» (даже если за пределами пузыря слова «кеш» и «постоянный» не имеют большого смысла).

Популярные варианты сегодня Memcached или Redis .

Таким образом, используя плагины «постоянного кэша», вы можете резко сократить количество запросов к базе данных, поскольку кэш не обновляется по каждому запросу.

2 строки кода выше будут вызывать максимум 1 запрос к базе данных.

Фактически, когда вы запрашиваете настраиваемое поле, все поля для этой записи извлекаются из базы данных, кэшируются через кеш объектов, а последующие запросы извлекают данные из кеша, а не из db.

То же самое происходит для терминов таксономии, WordPress один раз вытягивает все термины для таксономии, а затем возвращает их из кеша.

Кэш объектов очень широко используется в WordPress. Не только для сообщений, метазначений и таксономий, но также для пользователей, комментариев, данных темы …

Когда вы запрашиваете некоторые сообщения через WP_Query, по умолчанию WordPress не только извлекает их из базы данных (или из кеша, если они кэшированы), но также обновляет кеш для всех настраиваемых полей и все таксономии , связанные с поднятыми сообщениями.

Поэтому, когда вы вызываете, например, get_the_terms() или get_post_meta(), в то время как записи циклов, полученные через WP_Query, вы не фактически запускать любой запрос базы данных, но извлекать информацию из кеша.

Хорошо, да, но это связано со стоимостью.

Обновление кеша «магия», которое делает WordPress, когда вытягивает сообщения через WP_Query, происходит в update_meta_cache для мета и update_meta_cache для таксономий.

Если вы посмотрите на исходный код этих функций, вы увидите, что WordPress выполняет только один запрос db в каждой функции, но также выполняет большую обработку. Например, в update_object_term_cache есть 7 вложенных update_object_term_cache … если у вас много таксономий, а число сообщений на странице велико, это не очень хорошо.

Что такое WP_Query и 'update_post_meta_cache', если установлено 'update_post_term_cache', чтобы предотвратить обновление WordPress для пользовательских полей и таксономии, соответственно.

Вв этом случае при первом запросе пользовательского поля или таксономии запускается запрос базы данных, а данные кэшируются.

Как обычно, ответ зависит от . Большую часть времени, чтобы установить эти значения в false, является хорошим выбором, поскольку он предотвращает ненужную обработку и запросы к базе данных, если это не требуется, и кеш обновляется в любом случае, когда требуются пользовательские условия поля /таксономии .

Однако, если вы собираетесь вызывать, даже однажды, false во время цикла, и вы собираетесь называть get_post_meta() для всех (или большинства) таксономий, поддерживаемых сообщениями, то обновление кэша в любом случае запускается, и не может быть никакой реальной выгоды при настройке этих аргументов запроса на get_the_terms().

sprosi.pro

Произвольные поля в админке

Итак, пошагово:

  1. Переходим на страницу редактирования или создания нового поста.
  2. Прокручиваем вниз до блока «Произвольные поля».

    В версии WordPress 3.1 и выше этот блок может быть скрыт. Включите его в настройках экрана (о том как — читайте далее).

  3. Укажите имя (вы можете выбрать из списка один из уже используемых ключей либо ввести новый) и его значение и нажмите «Добавить произвольное поле».

Что делать, если в админке их нет?

В первую очередь проверьте «Настройки экрана» — галочка напротив «Произвольные поля» должна быть отмечена.

Если же в настройках экрана вы ничего подобного не нашли, то вероятнее всего тип поста, с которым вы работаете, не поддерживает использование произвольных полей — это легко поправимо при помощи add_post_type_support(). Код для functions.php:

Типы постов page (страницы) и post (записи) имеют поддержку произвольных полей по умолчанию!

Как вывести произвольные поля

1. the_meta()

Функция позволяет вывести все произвольные поля текущего поста в виде маркированного списка <ul>. Например для нашего случая код:

Выведет:

Параметров у функции нет.

2. get_post_meta()

Про get_post_meta() я уже подробно писал здесь.

3. get_post_custom()

Возвращает многоуровневый массив всех произвольных полей для текущего поста или поста, ID которого указан в параметрах функции.

Получим что-то вроде этого:

В отличие от функции the_meta(), get_post_custom() возвратит также и все скрытые произвольные поля поста.

4. get_post_custom_keys()

Функция возвращает массив ключей всех произвольных полей поста.

Выдаст:

Является производной от get_post_custom(), а если быть точным, то просто пропускает её результат через php-функцию array_keys().

5. get_post_custom_values()

Возвращает один из ключей функции get_post_custom() в виде массива, вне зависимости от количества аргументов.

Первый параметр функции обязателен (если вы его не укажите, будет возвращено null).

Как изменять значения произвольных полей

Ну во-первых, вы можете добавлять и изменять их через админку (об этом было написано выше). Во-вторых, для этих целей существует несколько функций.

1. update_post_meta()

Либо обновляет значение указанного произвольного поля, либо добавляет новое, если его не существует.

$post_id
(целое число) ID поста, метаданные которого нужно изменить.
$meta_key
(строка) ключ.

  • Если пост содержит несколько значений для одного и того же ключа, то, если не указан параметр $prev_value, будет обновлено первое найденное значение.
  • Если пост вообще не содержит метаданых с указанным ключом, тогда они будут добавлены.
$meta_value
(целое число|строка|массив) устанавливаемое значение.
$prev_value
(целое число|строка|массив) предыдущее значение параметра.

Пример:

2. add_post_meta()

Добавляет метаданные для указанного поста.

Последний параметр функции позволяет указать, нужно ли добавлять метаданные в том случае, если произвольное поле с указанным ключом уже имеется в базе данных:

  • false — нужно (стоит по умолчанию),
  • true — не нужно, ключ должен быть уникален.

    Предположим, что наш товар может иметь только один размер, поэтому второе произвольное поле с ключом size добавлено не будет.

3. delete_post_meta()

Удаляем метаданные для указанного в параметрах поста.

На случай, если метаданных с указанным ключом несколько, а нужно удалить только одно, конкретное, в третьем параметре функции можно указать, какое именно значение указанного ключа нужно удалить.

Фильтр, поиск и сортировка по произвольным полям

Про это уже написан целый пост, вы можете найти его по этой ссылке.

Произвольные поля для рубрик и меток

Сам по себе WordPress не имеет поддержки метаданных для таксономий (рубрик, меток и пр.), но в этом вам может помочь плагин Meta for taxonomies.

misha.blog

/**   * Runs on plugin activations   * - Transfer any settings which may have been set in the Lite version of the plugin   * - Creates a post type 'mc4wp-form' and enters the form mark-up from the Lite version   */  function mc4wp_pro_install()  {   // check if PRO option exists and contains data entered by user   $pro_options = get_option('mc4wp', false);   if ($pro_options !== false) {   return false;   }   $default_options = array();   $default_options['general'] = array('api_key' => '', 'license_key' => '');   $default_options['checkbox'] = array('label' => 'Sign me up for the newsletter!', 'precheck' => 1, 'css' => 0, 'show_at_comment_form' => 0, 'show_at_registration_form' => 0, 'show_at_multisite_form' => 0, 'show_at_buddypress_form' => 0, 'show_at_edd_checkout' => 0, 'show_at_woocommerce_checkout' => 0, 'show_at_bbpress_forms' => 0, 'lists' => array(), 'double_optin' => 1, 'send_welcome' => 0);   $default_options['form'] = array('css' => 0, 'custom_theme_color' => '#1af', 'ajax' => 1, 'double_optin' => 1, 'update_existing' => 0, 'replace_interests' => 1, 'send_welcome' => 0, 'text_success' => 'Thank you, your sign-up request was successful! Please check your e-mail inbox.', 'text_error' => 'Oops. Something went wrong. Please try again later.', 'text_invalid_email' => 'Please provide a valid email address.', 'text_already_subscribed' => 'Given email address is already subscribed, thank you!', 'redirect' => '', 'hide_after_success' => 0, 'send_email_copy' => 0);   $lite_settings = array('general' => (array) get_option('mc4wp_lite'), 'checkbox' => (array) get_option('mc4wp_lite_checkbox'), 'form' => (array) get_option('mc4wp_lite_form'));   foreach ($default_options as $group_key => $options) {   foreach ($options as $option_key => $option_value) {   if (isset($lite_settings[$group_key][$option_key]) && !empty($lite_settings[$group_key][$option_key])) {   $default_options[$group_key][$option_key] = $lite_settings[$group_key][$option_key];   }   }   }   // Transfer form from Lite, but only if no Pro forms exist yet.   $forms = get_posts(array('post_type' => 'mc4wp-form', 'post_status' => 'publish'));   if (false == $forms) {   // no forms found, try to transfer from lite.   $form_markup = isset($lite_settings['form']['markup']) ? $lite_settings['form']['markup'] : "<p>nt<label for="mc4wp_email">Email address: </label>nt<input type="email" id="mc4wp_email" name="EMAIL" required placeholder="Your email address" />n</p>nn<p>nt<input type="submit" value="Sign up" />n</p>";   $form_ID = wp_insert_post(array('post_type' => 'mc4wp-form', 'post_title' => 'Sign-Up Form #1', 'post_content' => $form_markup, 'post_status' => 'publish'));   $lists = isset($lite_settings['form']['lists']) ? $lite_settings['form']['lists'] : array();   update_post_meta($form_ID, '_mc4wp_settings', array('lists' => $lists));   update_option('mc4wp_default_form_id', $form_ID);   }   // store options   update_option('mc4wp', $default_options['general']);   update_option('mc4wp_checkbox', $default_options['checkbox']);   update_option('mc4wp_form', $default_options['form']);  }

hotexamples.com


You May Also Like

About the Author: admind

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.