Инициализировать

$wrapper = entity_metadata_wrapper($type, $id);
$wrapper = entity_metadata_wrapper($type, $entity);

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

try {
  $wrapper = entity_metadata_wrapper($type, $id);
  $entity = $wrapper->raw();

} catch (EntityMetadataWrapperException $exc) {
  watchdog(
    'mymodule',
    'EntityMetadataWrapper exception in %function() <pre>@trace</pre>',
    array(
      '%function' => __FUNCTION__,
      '@trace' => $exc->getTraceAsString()
    ),
    WATCHDOG_ERROR
  );
}

Сохранить

Можно использовать везде (осторожнее с хуками entity save).

$wrapper->save();

hook_entity_presave

Сущность в аргументе сохраняется сама после выполнения хука.
$wrapper->save() не нужен (приведёт к рекурсии hook_entity_presave).

hook_entity_insert

Сущность в аргументе уже сохранена в базе и находится в транзакции.
Но у сущности стоит статус isNew = TRUE.
При $wrapper->save() будет insert и ошибка.

Решение вызвать update самому.

$entity->is_new = FALSE;
$wrapper->save();
$entity->is_new = TRUE;

hook_entity_update

$wrapper->save();

Прочитать значения

Property

$wrapper->property_name->value();

Text, email, telephone, long text

$wrapper->field_name->value();

Number decimal

$wrapper->field_name->value();

List

// is list
if ($node_wrapper->field_name instanceof EntityListWrapper) { ... }
// key
$wrapper->field_name->value();
// value
$wrapper->field_name->label().
// options
$wrapper->field_name->optionsList()

Entity reference

foreach ($wrapper->field_name->getIterator() as $layout) {
  // entity exists
  if ($value = $layout->value()) {
    $ids[] = $value->id;
  }
}

Link

$wrapper->field_name->value()->url;
$wrapper->field_name->value()->title;
$wrapper->field_name->value()->attributes;

Date

// date
// @return timestamp
$wrapper->field_name->value();

// date double
// @return timestamp
$wrapper->field_name->value()->value;
$wrapper->field_name->value()->value2;

Заполнить значения

Property

$wrapper->property_name = $value;

Text, email, telephone, long text

$wrapper->field_name = $value;

Number decimal

$wrapper->field_name = (double) $value;

List

$options = $wrapper->field_contractor_group->optionsList();
$key = array_search($value, $options, 1);
if ($key !== FALSE) {
  $wrapper->field_contractor_group = $key;
}

Entity reference

// append
$wrapper->field_name[] = $id;
// replace all
$wrapper->field_name = $ids;

Link

$wrapper->field_name = array(
  'url' => $value,
  'title' => '',
  'attributes' => array()
);

Date

$wrapper->field_name = $value;

// date double
$wrapper->field_name->value = $value;
$wrapper->field_name->value2 = $value2;

Проверить на существование

// проверить на поле у bundle
isset($wrapper->field_name)

// проверка на значение у поля
$wrapper->field_name->value() !== NULL

Удалить значение

$wrapper->field_name = NULL;

Удалить сущность

$wrapper->delete();

П.С.
У любых поле значение которых не ровно NULL отображаются метки.
Если у текстового поля будет значение пустая строка например, увидите метку поля на сайте.