6.x-3.x views.module views_embed_view($name, $display_id = 'default')
7.x-3.x views.module views_embed_view($name, $display_id = 'default')

Embed a view using a PHP snippet.

This function is meant to be called from PHP snippets, should one wish to embed a view in a node or something. It's meant to provide the simplest solution and doesn't really offer a lot of options, but breaking the function apart is pretty easy, and this provides a worthwhile guide to doing so.

Note that this function does NOT display the title of the view. If you want to do that, you will need to do what this function does manually, by loading the view, getting the preview and then getting $view->get_title().


$name: The name of the view to embed.

$display_id: The display id to embed. If unsure, use 'default', as it will always be valid. But things like 'page' or 'block' should work here.

...: Any additional parameters will be passed as arguments.


./views.module, line 2237
Primarily Drupal hooks and global API functions to manipulate views.


function views_embed_view($name, $display_id = 'default') {
  $args = func_get_args();
  array_shift($args); // remove $name
  if (count($args)) {
    array_shift($args); // remove $display_id

  $view = views_get_view($name);
  if (!$view || !$view->access($display_id)) {

  return $view->preview($display_id, $args);


chadmandoo’s picture

The first option is the machine name of the view, this is found if you hover over the edit link on the views page and look at the link address. The second is the block or page machine name, so if its the first block it would be block_1 or block_2. This is found in the view under the "Other" list.

<?php print views_embed_view('blog_posts','block_1', $node->nid); ?>

Here is an example of views loading on a node page.


 * @file
 * Default theme implementation to display a node.
 * Available variables:
 * - $title: the (sanitized) title of the node.
 * - $content: An array of node items. Use render($content) to print them all,
 *   or print a subset such as render($content['field_example']). Use
 *   hide($content['field_example']) to temporarily suppress the printing of a
 *   given element.
 * - $user_picture: The node author's picture from user-picture.tpl.php.
 * - $date: Formatted creation date. Preprocess functions can reformat it by
 *   calling format_date() with the desired parameters on the $created variable.
 * - $name: Themed username of node author output from theme_username().
 * - $node_url: Direct url of the current node.
 * - $display_submitted: Whether submission information should be displayed.
 * - $submitted: Submission information created from $name and $date during
 *   template_preprocess_node().
 * - $classes: String of classes that can be used to style contextually through
 *   CSS. It can be manipulated through the variable $classes_array from
 *   preprocess functions. The default values can be one or more of the
 *   following:
 *   - node: The current template type, i.e., "theming hook".
 *   - node-[type]: The current node type. For example, if the node is a
 *     "Blog entry" it would result in "node-blog". Note that the machine
 *     name will often be in a short form of the human readable label.
 *   - node-teaser: Nodes in teaser form.
 *   - node-preview: Nodes in preview mode.
 *   The following are controlled through the node publishing options.
 *   - node-promoted: Nodes promoted to the front page.
 *   - node-sticky: Nodes ordered above other non-sticky nodes in teaser
 *     listings.
 *   - node-unpublished: Unpublished nodes visible only to administrators.
 * - $title_prefix (array): An array containing additional output populated by
 *   modules, intended to be displayed in front of the main title tag that
 *   appears in the template.
 * - $title_suffix (array): An array containing additional output populated by
 *   modules, intended to be displayed after the main title tag that appears in
 *   the template.
 * Other variables:
 * - $node: Full node object. Contains data that may not be safe.
 * - $type: Node type, i.e. story, page, blog, etc.
 * - $comment_count: Number of comments attached to the node.
 * - $uid: User ID of the node author.
 * - $created: Time the node was published formatted in Unix timestamp.
 * - $classes_array: Array of html class attribute values. It is flattened
 *   into a string within the variable $classes.
 * - $zebra: Outputs either "even" or "odd". Useful for zebra striping in
 *   teaser listings.
 * - $id: Position of the node. Increments each time it's output.
 * Node status variables:
 * - $view_mode: View mode, e.g. 'full', 'teaser'...
 * - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser').
 * - $page: Flag for the full page state.
 * - $promote: Flag for front page promotion state.
 * - $sticky: Flags for sticky post setting.
 * - $status: Flag for published status.
 * - $comment: State of comment settings for the node.
 * - $readmore: Flags true if the teaser content of the node cannot hold the
 *   main body content.
 * - $is_front: Flags true when presented in the front page.
 * - $logged_in: Flags true when the current user is a logged-in member.
 * - $is_admin: Flags true when the current user is an administrator.
 * Field variables: for each field instance attached to the node a corresponding
 * variable is defined, e.g. $node->body becomes $body. When needing to access
 * a field's raw values, developers/themers are strongly encouraged to use these
 * variables. Otherwise they will have to explicitly specify the desired field
 * language, e.g. $node->body['en'], thus overriding any language negotiation
 * rule that was previously applied.
 * @see template_preprocess()
 * @see template_preprocess_node()
 * @see template_process()
<div id="node-<?php print $node->nid; ?>" class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>

  <?php print $user_picture; ?>

  <?php print render($title_prefix); ?>
  <?php if (!$page): ?>
    <h2<?php print $title_attributes; ?>><a href="<?php print $node_url; ?>"><?php print $title; ?></a></h2>
  <?php endif; ?>
  <?php print render($title_suffix); ?>

  <?php if ($display_submitted): ?>
    <div class="submitted">
      <?php print $submitted; ?>
  <?php endif; ?>

  <div class="content"<?php print $content_attributes; ?>>
      // We hide the comments and links now so that we can render them later.
      print render($content);
         //Embedding the view before the comments are displayed
	<div class="embedded-view">
    	<?php print views_embed_view('blog_posts','block_1', $node->nid); ?>
  <?php print render($content['links']); ?>

  <?php print render($content['comments']); ?>

zifiniti’s picture

I needed to embed multiple displays from a view on a single page and I wanted the titles to show up as well.

I figured implementing this function manually would be better so I would only have to call views_get_view('my_view') once. It turns out this doesn't work so well.


$view views_get_view('my_view');
$displays = array('block_1', 'block_2', 'block_3');

foreach($displays as $display) {
  print $view->preview($display);

Something gets mucked up after the first display is used, because block_1's VBO (bulk operations) gets applied to all the subsequent displays that are previewed. The only fix I've found for this is to call views_get_view('my_view') again, which seems wrong...

Ayesh’s picture

If anyone is trying hard to figure out the display's machine ID, expand the "Advanced" pane (right most), and under "Other" configuration, you will see "machine name" setting that you can even change! In D6/Views2, you could just use it but now you can change it!

See: http://flic.kr/p/ejmaRf

aangel’s picture

Elsewhere in the docs you may see it recommended (like I did) the following:
$content .= views_embed_view('tracking_tag_list', 'panel_pane_1', array($arg1, $arg2));

This will not work (at least in the 7.x-3.5 version Views).

Use this instead:
$content .= views_embed_view('tracking_tag_list', 'panel_pane_1', $platform_type, $show_id);

which will work.

JediSange’s picture

But when you filter them on the UI side (IE: when you're building your view and adding contextual filters), how do you reference each one? For example, if I just pass in two integers, how does it know one is a reference to a nid and the other is a uid?

nijolawrence’s picture

When calling the embed view function you have to follow the same order in which the contextual filters are added.
ie, If you have added two contextual filters Nid and Uid in the give order.

Then while calling the views embed view you have to follow the same order

 $content = views_embed_view('<view_name>', '<display_name>', $nid, $uid);
ezy_’s picture

I'm not sure why the $nid and $uid fields are necessary. The simplest solution I found to print a view in a page.tpl.php was:

  $viewName = 'view_name_goes_here';
  print views_embed_view($viewName);
chadmandoo’s picture

They are only necessary if you are sending an argument that would be used for the contextual filter.

ItangSanjana’s picture

Confirmed. Worked w/wo arguments.

chadhester’s picture

We were running into issues where a callback function (run via cron our drush) would not return the view results, but it worked fine with devel's PHP execute page.

The issue was views access permissions and/or the entities it referenced. While it worked when we used the advanced query setting "Disable SQL rewriting", that was not ideal. Instead we opted to alter the global user temporarily, which might work for anyone else that runs into this use case... For example:


function my_example_callback($somearg) {
  global $user;
  $account = $user;
  $data = views_embed_view('my_view', 'page', $somearg);
  // Stuff ...
  // Reset the $user to the original value.
  $user = $account;
  return $data;

Kudos to Steve Colson for the quick tip! :)

chadhester’s picture

Forgot to mention the overload part... revised:

function my_example_callback($somearg) {
  global $user;
  $account = $user;
  $user = user_load(1); // Bypass access checks with User 1.
  $data = views_embed_view('my_view', 'page', $somearg);
  // Stuff ...
  // Reset the $user to the original value.
  $user = $account;
  return $data;
TolstoyDotCom’s picture

See "Safely Impersonating Another User":

StephenRobinson’s picture

This is a very useful method, but is rendered useless as all the custom templating is missing....

dpickerel’s picture

Is there no way to pass values for sorting? I have two exposed sort fields and two filter fields for standard stuff, published and node type.
I need the fields to be sortable, and by ajax if possible.

jeromewiley’s picture

Is there a way to attach the block_1 of a view using views_embed_view and tell the last field (quantity) to display as a drop-down field? Where would I set up the options, though? (For example, options from 0 - 10?)

{select class="form-..." id="edit-...-0" name="add_to_cart_quantity[0]"}{option value="0" selected="selected"}0{/option}{option value="1"}1{/option}{option value="2"

(using { instead of < because of the Forum constraints)

{option value="10"}10{/option}{/select}

albertski’s picture

If anyone needs a version of this function that also displays the title: https://gist.github.com/albertski/6af957aba26c5419ae48

Amarjit’s picture

Documentation should state "...: Any additional parameters will be passed as arguments." as an argument in the function prototype. This is easily missed.

KaseyMK’s picture

I have a text input field where my users can specify a view to be embedded on a page, in the form
I explode that value around the slashes into three pieces, so that multiple contextual filters can be handled separately: if I have
I'll explode the filters separately, and then implode that array into a comma-separated string, leaving me something like:
$contextual_filters = 'contextual_filter_one,contextual_filter_two'

I can successfully render the view with zero or one contextual filters in my tpl.php with:
echo views_embed_view('$view_name','$display_name',$contextual_filter);
(the view will ignore empty or extra contextual filters if it doesn't need them).

I can successfully render the view with two or more contextual filters with:
echo views_embed_view('$view_name','$display_name',$contextual_filter_one,$contextual_filter_two);

However, if I don't know how many filters my input might have, I'd prefer to pass along the imploded string rather than to explicitly enter each filter offset, but
echo views_embed_view('$view_name','$display_name',$contextual_filters);
does NOT work.

After lots of trial and error, it is clear that any comma in the $contextual_filters variable will cause a failure to render the view.