Wordpress Post 格式下拉列表为空

Wordpress Post Format Dropdown Empty

我正在开发一个 wordpress 主题。该主题根据用户配置的复选框启用默认支持的 post 格式的子集,如下所示:

function mytheme_enable_theme_support(){
  $options = get_option('post_formats');
  $formats = array('aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat');
  $output = array();
  foreach($formats as $format){
    if (isset($options[$format])){
      $output[] = $format;
    }
  }
  if(!empty($options)){
    add_theme_support('post-formats', $output);
  }
}
add_action('after_setup_theme', 'mytheme_enable_theme_support');

检索到的选项的 GUI 设置页面工作正常,我已经在数据库级别验证了我想看到的 post 格式。

我在日志中看不到任何错误。添加新的 post 时,您应该可以选择 post 格式,但下拉菜单中没有选项。

有谁知道是什么原因吗?

我是 运行 NGINX 上的 Wordpress 5.8.1 PHP 8.0.

更新:

我用自己编写的调试例程修改了上面的代码 debug(),它将变量的内容打印到文件中,如下所示:

  if(!empty($options)){
    debug(print_r($output,true)."\n");
    debug(print_r($options,true)."\n");
    add_theme_support('post-formats', $output);
  }

上面两个debug()调用的输出如下:

Array ($output)
(
    [0] => gallery
    [1] => video
    [2] => audio
)

Array ($options)
(
    [gallery] => 1
    [video] => 1
    [audio] => 1
)

在我看来,无论代码中上面发生了什么,对 add_theme_support('post-formats', $output); 的调用都是正确的。所以我认为我的问题是……为什么我没有在 post 格式下拉列表中看到这些选项?我还能在哪里查看可能发生的情况?

更新二:

这是我的 运行 代码的经过精心注释的版本,供感兴趣的人使用。

//enable the post formats chosen in the theme settings
function mytheme_enable_theme_support(){
  $options = get_option('post_formats'); 
  /* if the option 'post_format' is found in the DB, creates an arrray of what it contains
     in my case, that array looks like this:

     Array (
         [gallery] => 1
         [video] => 1
         [audio] => 1
     )     

     if the option is not found, $options will contain NULL.
  */
  
  $formats = array('aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat');
  /* here we initialize a temporary variable with all the supported post formats. This is so that we 
     can use it below to build an array of just the ones configured. There are likely better ways to 
     do this but this works.

  */
  
  $output = array(); //initialize $output as an empty array
  
  foreach($formats as $format){
    /* loop through the $formats array defined above. This loop will execute 9 times.
       each time it executes $format will contain the next string in the sequence 
       ('aside', 'gallery', 'link', etc.)
    */
    if (isset($options[$format])){
      /* this if statement checks to see if the current $format string exists as a key in the $options
      array. 
        if (isset($options['aside']))
        if (isset($options['gallery']))
        if (isset($options['link']))
        if (isset($options['image']))
        etc.
      */  
      
      $output[] = $format;
      /* if it does, this assignment pushes the current format string onto the $output array. 
      $output[] = $format; is equivalent to array_push($output, $format);
      See https://www.php.net/manual/en/function.array-push.php for details.
      */
    }
    // $output[] = ( @$options[$format] == 1 ? $format : ''); // '@' is shorthand for 'isset()'
  }
  if(!empty($options)){
    // when we're all done, if we have any elements in the $options array... 

    debug(print_r($output,true)."\n");
    debug(print_r($options,true)."\n");
    // configure the theme to support them
    add_theme_support('post-formats', $output);
  }

问题出在你的代码中。

  $options = get_option('post_formats');
  $formats = array('aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat');
  $output = array();
  foreach($formats as $format){
    if (isset($options[$format])){
      $output[] = $format;
    }
is shorthand for 'isset()'
  }
  if(!empty($options)){
    add_theme_support('post-formats', $output);
  }

在您的 $options 之后添加这个 =

var_dump($options);
die();

正在测试它是否 returns 为空它什么也不会做。

foreach($formats as $format){
        if (isset($options[$format])){
            $output[] = $format;
        }
    }

这只是循环遍历您的 $formats 但从未构建数组,因此 $output 只是空的。

您可以添加自己的列表:

add_theme_support(
        'post-formats',
        array(
            'link',
            'aside',
            'gallery',
            'image',
            'quote',
            'status',
            'video',
            'audio',
            'chat',
        )
    );

由于您从不添加或使用 $options,因此很难判断您是否正在尝试使用现有的 + 新的。

此外,如果这是一个自定义主题,那么这些选项已经添加到某处,最好更新该部分以包含新选项。

我发现了问题。它与我的代码无关。上面的所有讨论都是在转移注意力。

主题根目录中缺少 index.php 模板文件以某种方式破坏了 post 编辑器中的 post 格式 drop-down 菜单。我对 WordPress 的内部结构不够了解,无法推测可能发生的情况。你们中的一些人可能理解这一点,如果理解,请添加评论或其他答案以供记录。

根据记录的模板层次结构 here,index.php,如果存在以下模板,则不需要用于呈现所有页面的默认模板:

  • archive.php
  • single.php
  • page.php
  • home.php
  • 404.php
  • search.php

但这显然不是这样的。如果 index.php 丢失,无论是否存在任何其他模板,都没有可用的 post-formats drop-down 菜单。

郑重声明,我的新 index.php 页面是我的 home.php 的副本,包含以下代码:

<?php get_header();
?>
  <div id="primary" class="content-area">
    <main id="main" class="site-main" role="main">
        <?php
          if(have_posts()):

            while(have_posts()): the_post();

                get_template_part('template-parts/content', get_post_format());

            endwhile;

          endif;
         ?>
    </main>
  </div> <!-- #primary -->

<?php get_footer(); ?>

如您所见,至少代码中没有发生任何奇怪的事情。我是 运行 WordPress 5.8.1 和 PHP 7.4。在 DevKinsta 版本 2.4.1 (2.4.1.3185) 上。