【问题标题】:Wordpress: Inserting if-else statement into next_post_link() / previous_post_link() parameters?Wordpress:将 if-else 语句插入 next_post_link() / previous_post_link() 参数?
【发布时间】:2011-06-18 09:16:20
【问题描述】:

这里的第一个问题,虽然阅读和搜索已经救了我很多次。

我是一个 PHP 黑客充其量,我正在构建的 Wordpress 主题迫使我学习很多东西。

我在尝试让下一个和上一个链接的格式根据它们各自的类别(而不是 single.php 的页面)以不同方式显示时遇到了问题。

这是我迄今为止最好的尝试:

<?php next_post_link(
    '%link',
    if ( in_category( 'tweet' ) ) {
        get_the_content()
    } else {
        echo '%title'
    };,
    FALSE 
)?>

这会导致语法错误。

我的第一个问题是我什至可以在函数的参数中使用 if-else 语句吗?

如果我以完全错误的方式接近它,那么它又回到了绘图板上。如果有任何替代建议,我也将不胜感激!

我知道以下工作:

next_post_link( '%link', get_the_title(), FALSE );
next_post_link( '%link', '%title', FALSE );

为了更清楚地说明,我希望根据链接本身的类别而不是它们所在的当前主机页面来影响下一个/上一个链接的输出。

我遇到的问题是 a) 如何确定 next_post_link() 和 previous_post_link() 是什么类别,然后 b) 相应地显示它们的 Link 参数。如果我可能会抛出白旗,那么我使用get_adjacent_post() 和各种数组等找到的示例在这一点上似乎超出了我的想象。我非常感谢有人指导我完成使用它们的任何解决方案。

【问题讨论】:

    标签: php wordpress


    【解决方案1】:

    目标是什么?

    我认为你混合的东西太多了,这使得你的问题比它需要的更复杂。我知道有很多新事物,这很容易发生,所以我认为在开始编码之前花一些想法来思考要做什么是值得的。它最终应该会有所帮助。

    开始制定您想要实现的目标。如果我理解正确,您写道您希望根据类别在当前帖子下方以不同方式显示下一个和上一个链接。

    但是哪个类别?显示的当前帖子之一?还是上一个/下一个链接帖子的类别

    除此之外,帖子可以有多个类别。您要根据一个或多个甚至所有类别更改显示吗?

    最后:您想输出大量的 HTML 标记 用于视觉样式吗?或者你想为此使用 CSS

    怎么做?

    在您考虑您真正想要实现的目标之后,您可以考虑如何做到这一点。

    下面我将展示一些示例代码,它们将执行以下操作:

    • 说明您要更改的 link-format 参数的用法。
    • 展示了如何获取相关链接的 CSS 类。
    • 使用这些 CSS 类扩展主题的输出。
    • 使其可重复用于您主题中的不同文件。

    所以这个例子涵盖了链接帖子的类别,通过你的主题的 CSS 进行视觉样式,我认为这是更可取的方式。

    PHP 代码

    PHP 非常灵活,所以最终很容易完成,但是在不知道具体做什么的情况下,PHP 中的这种灵活性可能会成为一个问题,因为它也可能会丢失线索然后编写一些非-工作。

    假设您只想更改next_post_link() 函数的链接格式

    该函数会将%link 替换为HTML 链接标记(&lt;a href=...&gt;Post Title&lt;/a&gt;),因此如果您将'This is the next post of my blog: %link; waiting to be read!' 作为参数,则您在链接周围添加了一些文本。

    <?php
      $format = 'This is the next post of my blog: %link; waiting to be read!';
      next_post_link($format);
    ?>
    

    您也可以在其周围添加 HTML 标签:

    <?php
      $format = '<span style="font-size:2em">%link</span>';
      next_post_link($format);
    ?>
    

    这将使所有下一个帖子链接的标准字体大小增加一倍。

    所以现在为了让主题更容易一点,最好是添加类别的 css 类,然后您可以在 CSS 中轻松更改显示。

    <?php
      $inSameCategory = true; // depends on what you want, can be false as well
      $nextPost = get_adjacent_post($inSameCategory, '', false);
      $cssClasses = get_post_class('next-post-link ', $nextPost);
      $format = sprintf('<span class="$s>%link</span>', $cssClasses);
      next_post_link($format);    
    ?>
    

    这会将下一个帖子链接包装到一个 &lt;span&gt; 中,其中包含链接帖子的所有 CSS 类以及一个 next-post-link 类,以防您需要 CSS 选择器来设置链接样式。这里有一些示例 CSS:

    .next-post-link.category-tweet {font-size: 2em;}
    

    使其可重复使用

    由于您有一个下一个和上一个链接,您可以复制该代码仅用于更改一个参数。但是我们很懒惰,而是将其包装成它自己的函数:

      /**
       * my theme's format string for prev|next_post_link()
       *
       * @param bool $previous (optional) previous (true, default) or next (false) post
       * @param bool $inSameCategory (optional) use same category, default: true
       * @return string
       */
      function my_prev_next_link_format($previous = true, $inSameCategory = true) {
        $postId = get_adjacent_post($inSameCategory, '', $previous);
        $cssClasses = get_post_class('next-post-link ', $nextPost);
        $format = sprintf('<span class="$s>%link</span>', $cssClasses);
        return $format;
      }
    

    将此功能放入主题的functions.php。然后在您的所有模板中都可以使用它。现在使用它变得非常容易:

    <?php prev_post_link(my_prev_next_link_format()); ?>
    ...
    <?php next_post_link(my_prev_next_link_format(false)); ?>
    

    如果您将所有这些放在一起,您可以轻松地在主题的 CSS 中设置下一个和上一个链接的样式。

    【讨论】:

    • 回复的很深入;对此,我真的非常感激。我打算晚上上交,早上试一试。 functions.php 中的工作只是我迄今为止一直在犹豫尝试的那种 PHP 繁重的工作......虽然只有两美分,但我认为这些天最好的做法是在实际可行的情况下避免使用内联样式。 ..
    • 您仍然可以复制和粘贴两个链接的代码,但我认为这会使事情变得更加复杂,然后在functions.php 中轻松访问。在地方编辑和调试而不是很多。晚安。
    【解决方案2】:

    你试过anonymous functions吗?这样你就可以在函数中使用 if-else 语句

    【讨论】:

      【解决方案3】:

      试试:

      $format_string = in_category('tweet') ? 
      '<span style="color:red;">%link</span>' : '%link';
      
      next_post_link($format_string);
      

      第二个和第三个参数是可选的,默认为title和false。

      编辑:

      我不知道这个插件,但是..

      if(in_category('tweet')){
      $format_string = '<span style="color:red;">%link</span>';
      $link_text = get_the_content();
      }else{
      $format_string = '%link';
      $link_text = '%title';  
      }
      
      next_post_link($format_string, $link_text);
      

      【讨论】:

      • 好吧,问题是我不想使用“tweet”类别的标题(我使用的插件将特定的推文自动化到 Wordpress - 它生成的标题对用户不友好,因此使用get_the_content)。
      • 那么,我可以把第二个建议放到functions.php中吗?因为只是将它放到 single.php 模板中会导致 $link_text 由页面的类别而不是链接决定。可以去试试看会发生什么。
      • 从您所说的看来,将 FALSE 作为 next_post_link() 的第三个参数在您的代码中没有按预期工作?只需查看documentation,如果您想具体说明包含/不包含哪些类别,则有一个可选的第四个参数: excluded_categories: (string) 不应列出下一篇文章的数字类别 ID .用 and 分隔多个类别;例如:'1 and 5 and 15'。 所以要排除当前类别,只需将其 categoryID 作为第 4 个参数传递即可。
      • 至于是否将所有内容都放在functions.php中,我想说最好在制作函数之前先获取当前页面上正在运行的所有内容。很可能它不应该超过几行代码,因为您只需要找到并实现已经存在的函数。
      猜你喜欢
      • 1970-01-01
      • 2012-04-13
      • 2019-04-09
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      • 2015-08-18
      相关资源
      最近更新 更多