在自定义操作挂钩中打印快捷码,而不是在输入快捷码的位置

时间:2013-09-11 作者:Jason

我在我的主题中添加了一个自定义的动作挂钩。我希望能够在\\u content()中的任何位置输入一个短代码,并在自定义操作挂钩而不是输入短代码的位置打印该短代码。

短代码在标题中显示库和自定义挂钩。

如果我直接在动作回调中执行\\u shortcode(),但该快捷码会显示在所有页面上,那么它就可以工作。所以我知道钩子在起作用,但我只想让库显示在页眉中,短代码被输入到\\u content()中。

2 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

我想我应该使用一个元框:

// create the meta box
function dht_box() {
    add_meta_box(
        \'dht_box\', // id, used as the html id att
        __( \'Do Header Thing\' ), // meta box title
        \'dht_cb\', // callback function, spits out the content
        \'post\' // post type or page. This adds to posts only
    );
}
function dht_cb($post) {
  $meta = get_post_meta($post->ID,\'do_header_thing\',true);
  echo \'<input type="checkbox" name="do_header_thing" \',checked($meta),\' />\';
}
add_action( \'add_meta_boxes\', \'dht_box\' );

// save the data
add_action(
  \'save_post\',
  function ($post_id) {
    if (isset($_POST[\'do_header_thing\'])) {
      add_post_meta($post_id,\'do_header_thing\',true);
    } else {
      delete_post_meta($post_id,\'do_header_thing\',true);
    }
  }
);
然后,在模板文件中或在适当的挂钩上使用:

if (is_single()) {
  $obj = get_queried_object();
  $dht = get_post_meta($obj->ID,\'do_header_thing\',true);
  if (!empty($dht)) { 
    echo \'Yay\';
  }
}
非常粗糙的代码,但这应该给你一个想法。

SO网友:gmazzap

所以你调用一个自定义操作,比如do_action(\'print_gallery\'); 在标题中,现在您希望当触发此操作时,它打印插入帖子内容中任何位置的shorcode的内容。

当然,当你打印时the_content() 您不希望再次打印短代码。

因此,在挂钩的函数中print_gallery 操作您可以插入如下内容:

add_action(\'print_gallery\', \'print_gallery_shortcode\');

function print_gallery_shortcode() {
  if ( ! is_single() ) return;
  $shortcode_name = \'gallery\';
  $content = get_queried_object()->post_content;
  if (
    preg_match_all( \'/\'. get_shortcode_regex() .\'/s\', $content, $matches )
    && array_key_exists( 2, $matches ) && in_array( $shortcode_name, $matches[2] )
  ) {
    foreach ( $matches[2] as $i => $sc ) {
      if ( $sc == $shortcode_name ) {
        echo do_shortcode( $matches[0][$i] );
        // prevent shortcode is printed again in the post content
        add_shortcode($shortcode_name, \'__return_false\'); 
      }
    }
  }
}
我用过标准的wordpress[gallery] shortcode,如果使用自定义的,只需在$shortcode_name 变量

现在,您可以在内容中的任何位置插入快捷码,并且快捷码输出将打印在您拥有的位置do_action(\'print_gallery\') 而不是在内容中。

(当然,如果函数the_content() 在之前调用do_action(\'print_gallery\') 您将获得一个复制的快捷码:我的函数无法阻止已经发生的事情……)

请注意,函数doesn\'t 干扰在帖子内容中插入的、通常在内容中打印的其他短代码。

结束

相关推荐

Shortcode in AJAX popup

我试图使用Ultimate Facebook插件的一个短代码在AJAX弹出窗口中显示FB connect按钮,但似乎无法正常工作。我搜索并使用了djb在这个问题上给出的解决方案-Why might a plugin's 'do_shortcode' not work in an AJAX request?, 但它只起了部分作用。理想情况下,我希望用户能够使用FB登录,然后将列表保存到她的帐户。我想使用插件而不是嵌入直接代码,因为当有人使用FB connect时,也会在wordpre