【问题标题】:Wrong format of post views count in wordpresswordpress 中帖子查看次数的错误格式
【发布时间】:2016-04-16 02:29:25
【问题描述】:

我打印一行包含发布日期和查看次数(使用插件wp-PostViews)。但是,我得到的是26 [icon] 2016-01-09 [icon] views,而不是[icon] 2016-01-09 [icon] 26 views(观看次数的位置错误),如下所示:

以下是源代码:

$time_string_published = '<time class="entry-date published" datetime="%1$s">%2$s</time>';
$time_string_published = sprintf( $time_string_published,
        esc_attr( get_the_date( 'c' ) ),
        esc_html( get_the_date( 'Y-m-d' ) )
);

printf( '<span class="posted-on">%1$s</span><span class="views-link">%2$s</span>',
                sprintf( '<a href="%1$s" rel="bookmark">%2$s</a>',
                        esc_url( get_permalink() ),
                        $time_string_published
                ),
                sprintf('%1$s views', the_views())
        );

相关的css设置有:

.entry-meta .views-link:before {
        display: inline-block;
        -webkit-font-smoothing: antialiased;
        -moz-osx-font-smoothing: grayscale;
        font: normal 22px/1 'Genericons';
        vertical-align: top;
}
.entry-meta .views-link:before { content: '\f403'; }

顺便说一句,以下代码工作正常,显示为[icon] 26(正确位置)。

<span class="views-link">
      <?php if(function_exists('the_views')) { echo the_views(); } ?>
</span>

执行上述代码后是否有可能加载了插件wp-PostViews(包含函数the_views())?

【问题讨论】:

    标签: php wordpress return echo


    【解决方案1】:

    我不确定其他人 - 但这似乎有点过分尝试这样做。为什么不试试呢:

    $url = esc_url( get_permalink() );
    $time = $time_string_published;
    $views = the_views();
    
    $out = <<<EOD
    <span class="posted-on"><a href="$url"
    rel="bookmark">$time</a></span><span class="views-link">$views</span>
    EOD;
    
    printf( "%s", $out );
    

    上面做了同样的事情,但更清楚一点。对不起!以为我有它,但我最初弄错了。我现在已经更正了生成的代码。所以现在我说 - 你检查过 $time_string_published 给你什么了吗?

    顺便说一句:如果您对 the_views() 的回声给您“ico 26 次浏览”,为什么不这样做:

    $views = substr( the_views(), 4 );
    

    获得“26 次观看”部分。然后它会自动将“视图”卡在它的末尾。只是一个想法。

    更新:晚上 8 点 57 分

    这是修改后的代码。它对我有用。

    <?php
    
    $time_string_published = '<time class="entry-date published" datetime="%1$s">%2$s</time>';
    $time_string_published = sprintf( $time_string_published,
            date( 'c', time() ),
            date( 'Y-m-d', time() )
    );
    
    printf( '<span class="posted-on">%1$s</span><span class="views-link">%2$s</span>',
                    sprintf( '<a href="%1$s" rel="bookmark">%2$s</a>',
                            ( get_permalink() ),
                            $time_string_published
                    ),
                    sprintf('%1$s views', the_views())
            );
    
    $date1 = date('c', time() );
    $date2 = date('Y-m-d', time() );
    $time_string_published = "<time class='entry-date published' datetime='$date1'>$date2</time>";
    
    $url = get_permalink();
    $view = the_views();
    
    $s = "<a href='$url' rel='bookmark'>$time_string_published</a>";
    echo "<p><span class='posted-on'>$s</span> <span class='views-link'>$view views</span>";
    
    function get_permalink()
    {
        return "http://www.google.com";
    }
    function the_views()
    {
        return 26;
    }
    
    ?>
    

    输出是:

    2016-01-1226 views
    
    2016-01-12 26 views
    

    页面源代码为:

    <span class="posted-on"><a href="http://www.google.com" rel="bookmark"><time class="entry-date published" datetime="2016-01-12T02:55:41+00:00">2016-01-12</time></a></span><span class="views-link">26 views</span><p><span class='posted-on'><a href='http://www.google.com' rel='bookmark'><time class='entry-date published' datetime='2016-01-12T02:55:41+00:00'>2016-01-12</time></a></span> <span class='views-link'>26 views</span>
    

    请注意,第二行在第一个 SPAN 和第二个 SPAN 之间有一个空格。如果您没有得到相同的输出,那么 WordPress 或整个程序的某些其他部分会出现问题。关于我能提供的所有帮助。 :-)

    【讨论】:

    • $time_string_published 是正确的(我将其添加到问题中)。我修改了一个 wordpress 主题。
    • 抱歉 - 忽略了 printf() 函数。顺便说一句 - 我以前见过 printf 在与 sprintf 一起使用时弄脏了。我认为他们有时会互相干扰。
    • 在您尝试执行任何 Javascript 之前,所有插件都应该已经加载,除非您是即时执行的。 (即:您加载并继续前进。)为了确保在执行任何操作之前加载整个文档,您应该使用 jQuery 中的 document.ready() 函数。在 PHP 方面 - 在您尝试使用某些东西之前,您的所有包含/要求都应该出现。如果那个“东西”不存在,当你尝试使用它时它会出错。
    • 我刚看到这个:stackoverflow.com/questions/27120684/…。注意输出?这就像你的问题。那里发生的事情是 PRINTF 以一种方式打印事物,而 SPRINTF 以另一种方式打印它们。因此,即使您以正确的顺序放置它们 - PHP 处理它们的方式也会使它们按照您的体验进行操作。在链接中,发生的是首先触发 PRINTF 并使 $str_1 = 6(字符串的长度)。因此,当到达 ECHO 时,字符串已经打印出来,然后将 $str_1 的值附加到末尾。
    • 在您的情况下,问题在于 PRINTF 和 SPRINTF 的操作方式也不同。所以我不得不猜测 PRINTF、SPRINTF 和 ECHO 都以不同的方式运行以达到最终目的(即获得所需的输出)。尤其是把一个电话放在另一个电话里面。我从不这样做,或者更确切地说,我只对数学公式这样做。输出我总是尽量保持分开。准备好要输出的所有内容,然后只进行输出并坚持使用 PRINTF 或 ECHO - 而不是两者兼而有之。
    【解决方案2】:

    最后,我追踪了它。原因是函数the_views()直接打印了一些东西,而不是返回一个变量。以下是源代码:

    ### Function: Display The Post Views
    function the_views($display = true, $prefix = '', $postfix = '', $always = false) {
            $post_views = intval( get_post_meta( get_the_ID(), 'views', true ) );
            $views_options = get_option('views_options');
            if ($always || should_views_be_displayed($views_options)) {
                    $output = $prefix.str_replace( array( '%VIEW_COUNT%', '%VIEW_COUNT_ROUNDED%' ), array( number_format_i18n( $post_views ), postviews_round_number( $post_views) ), stripslashes( $views_options['template'] ) ).$postfix;
                    if($display) {
                            echo apply_filters('the_views', $output);
                    } else {
                            return apply_filters('the_views', $output);
                    }
            }
            elseif (!$display) {
                    return '';
            }
    }
    

    要解决这个问题,将参数false 传递给the_views 以作为变量返回,即the_views(false)

     printf( '<span class="posted-on">%1$s</span><span class="views-link">%2$s</span>',
                    sprintf( '<a href="%1$s" rel="bookmark">%2$s</a>',
                            esc_url( get_permalink() ),
                            $time_string_published
                    ),
                    sprintf('%1$s views', the_views(false))
            );
    

    【讨论】:

    • 很高兴你找到它!玩得开心!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多