如何手动编写短码?

时间:2015-12-24 作者:Travis Patron

我想插入一个函数,该函数以其他方式表示为WP短代码。插入此代码时,页面无法完全显示。以下是包含短代码的完整代码:

function vntd_blog_carousel($atts, $content = null) {
extract(shortcode_atts(array(
    "cats" => \'\',
    "posts_nr" => \'\',
    "thumb_style" => \'\'
), $atts));

wp_enqueue_script(\'prettyPhoto\', \'\', \'\', \'\', true);
wp_enqueue_style(\'prettyPhoto\');

wp_enqueue_script(\'owl-carousel\', \'\', \'\', \'\', true);
wp_enqueue_style(\'owl-carousel\');

ob_start();

echo \'<div class="vntd-portfolio-carousel blog-carousel"><div class="works white">\';

$size = \'portfolio-square\';

wp_reset_postdata();

$args = array(
    \'posts_per_page\' => 6,
    \'cat\'       => 4,
    \'orderby\'   => \'slug\'
);
$the_query = new WP_Query($args); 

if ($the_query->have_posts()) : while ($the_query->have_posts()) : $the_query->the_post();
我通常会使用短代码,但我会将其直接放在PHP页面文件中。但是,输出无法在页面上显示,页面无法加载此代码。我假设这是因为我手动填写的其中一个参数有错误。

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

您的代码严重损坏。

您启动函数定义,但从未完成它。没有关联} 结束函数if 有条件的,永远不要关闭它while 循环,切勿关闭这就是您的页面无法加载该代码的原因。您将遇到一个致命的PHP错误,如果整个脚本在第一个脚本中没有跳转,那么将出现多个致命错误。如果你有debugging enabled 你会看到的。

您也在以一种根本无法完成任何事情的方式使用输出缓冲,如果我没有弄错的话,即使您没有致命错误,也会导致页面的其余部分无法显示此外,您的循环无论如何都不会输出任何内容,因为您没有包含任何实际echos post信息。您需要的最小修复是:

您正在将类别信息传递到shortcode中,但在查询中硬编码了一个类别。我已经更改了你的默认值以进行补偿。

function vntd_blog_carousel($atts, $content = null) {
  extract(shortcode_atts(array(
      "cats" => 6, // default cat, if any
      "posts_nr" => \'\',
      "thumb_style" => \'\'
  ), $atts));

  wp_enqueue_script(\'prettyPhoto\', \'\', \'\', \'\', true);
  wp_enqueue_style(\'prettyPhoto\');

  wp_enqueue_script(\'owl-carousel\', \'\', \'\', \'\', true);
  wp_enqueue_style(\'owl-carousel\');

  ob_start();

  echo \'<div class="vntd-portfolio-carousel blog-carousel"><div class="works white">\';

  $size = \'portfolio-square\';

  $args = array(
      \'posts_per_page\' => 6,
      \'cat\'       => $cats,
      \'orderby\'   => \'slug\'
  );
  $the_query = new WP_Query($args); 

  if ($the_query->have_posts()) {
    while ($the_query->have_posts()) {
      $the_query->the_post();
      // echo some post data
      the_title();
      the_content();
    } // close the while Loop
  } // close the if conditional

  wp_reset_postdata(); // moved from before the Loop where it really wasn\'t doing any good

  return ob_get_clean(); // use the output buffer that you\'ve created
} // close the function definition.
查看代码注释以了解我所做的一切。我还对代码进行了格式化以提高可读性,并删除了这一噩梦alternative control syntax, 这只适合疯狂制作。

要将整个过程转化为一个短代码,您只需:

add_shortcode(\'vntd_blog_carousel\',\'vntd_blog_carousel\');
要手动运行,请使用:

do_shortcode(\'[vntd_blog_carousel cats="2"]\');
我不知道其他两个短代码属性应该做什么。

相关推荐

在循环外部调用is_Single()

所需的文件不会加载到单个帖子上,也不会加载到任何地方!如果我删除is_single() 功能我可以让它工作。我的问题是如何检查当前页面是否为帖子?我看了其他问题,看起来我调用的是循环外的函数,但无论我在这些答案中尝试什么都不起作用!!你会怎么处理?谢谢class Something { function my_func() { if ( is_single() ) { require_once( \'/lib/control