Define a Panels visibility rule programatically I'm trying to define a Panels visibility rule (access plugin) programmatically but I'm running into a problem.

My code is below.  This code works as a Selection Rule (on the Access tab), but when I try to add my access plugin as a Visibility Rule (on the Content tab), the plugin is added to the panel pane, but it doesn't show up in the UI under "Visibility rules."  So there's no way to delete it, and the title isn't shown.

I assume I failed to declare something that makes it show up in the Visibility Rules, but I haven't been able to figure out what.  I was following this guide, but my plugin is simpler than the one in the example (no configuration necessary).

&lt;?php
/**
 * @file
 * Plugin to check whether the value matches the proximity query string
 * https://drupal.stackexchange.com/questions/33336/what-are-ctools-plugin-content-type-access-etc-and-how-does-one-create-them/33337#33337
 */

/**
 * Plugins are described by creating a $plugin array which will be used
 * by the system that includes this file.
 */
$plugin = array(
  'title' =&gt; t("Check proximity query string"),
  'description' =&gt; t('Returns FALSE if the proximity search query string is set'),
  'callback' =&gt; 'mymodule_checkproxquerystring_ctools_access_check',
  'settings form' =&gt; 'mymodule_checkproxquerystring_ctools_access_settings',
);

/**
 * Settings form for the 'term depth' access plugin.
 */
function mymodule_checkproxquerystring_ctools_access_settings($form, &amp;$form_state, $conf) {
  return $form;
}

/**
 * Check for access.
 */
function mymodule_checkproxquerystring_ctools_access_check($conf, $context) {
  if (isset($_GET['d']) &amp;&amp; (is_numeric($_GET['d']))) {
    return FALSE;
  }
  else {
    return TRUE;
  }
}
I think probably that is due to the missing 'summary' key from your '$plugin'. A simple access plugin to check if the current page can be defined as :

$plugin = array(
  'title' =&gt; t('Front page'),
  'description' =&gt; t('Is this the front page.'),
  'callback' =&gt; 'ctools_front_ctools_access_check',
  'default' =&gt; array('negate' =&gt; 0),
  'settings form' =&gt; 'ctools_front_ctools_access_settings',
  'summary' =&gt; 'ctools_front_ctools_access_summary',
);

/**
 * Settings form for the 'by parent term' access plugin
 */
function ctools_front_ctools_access_settings($form, &amp;$form_state, $conf) {
  // No additional configuration necessary.
  return $form;
}

/**
 * Check for access.
 */
function ctools_front_ctools_access_check($conf, $context) {
  if (drupal_is_front_page()) {
    return TRUE;
  }
  else {
    return FALSE;
  }
}

/**
 * Provide a summary description based upon the checked terms.
 */
function ctools_front_ctools_access_summary($conf, $context) {
  return t('The front page');
}


The canonical reference of this could be found in the access plugins defined in the ctools module itself.