【问题标题】:Wordpress content displaying weird when using foreach使用 foreach 时 Wordpress 内容显示奇怪
【发布时间】:2013-09-06 11:19:06
【问题描述】:

我目前正在客户的 wordpress 网站上做一些定制工作。我正在使用下面的代码来查询运行良好的数据库。但是,当我尝试显示结果时,它不能正常工作。基本上我正在尝试查询 postmeta 表以从我添加的自定义字段中查找信息,在这种情况下可能是我的名字,andy。一旦系统找到所有自定义字段值为 andy 的帖子,它应该使用这些行的 id 并显示每行的标题、内容和日期。这工作正常,直到我实时查看页面,基本上它正在计算我的名字出现的次数,并从所有行中回显信息,而我希望它只回显来自已发布行的信息。任何人都可以帮助,让我头疼!:

PHP

<?php
        require_once('dbConfig.php');

        // This variable grabs the name in the URL
        $r = get_permalink();
        $r = explode('/', $r);
        $r = array_filter($r);
        $r = array_merge($r, array()); //reset keys
        $code = $r[3];

        $getName = preg_replace("/[^a-zA-Z0-9\s]/", "", $code);
        $name = $db->real_escape_string($getName);
        ?>

        <?php
        $allposts = $wpdb->get_results( $wpdb->prepare("SELECT post_id FROM $wpdb->postmeta WHERE meta_value = %s", $name) );
        foreach ($allposts as $singlepost) { 
            $wpPosts = $wpdb->get_row( $wpdb->prepare("SELECT post_title, post_content, post_date_gmt FROM $wpdb->posts WHERE ID = %d AND post_status = 'publish' AND post_type='post' ORDER BY ID DESC", $singlepost->post_id) );
            $wpPostsDate = new DateTime($wpPosts->post_date_gmt);
            echo '<h1>'.$wpPosts->post_title.'</h1><br>';
            echo 'Post Content: '.$wpPosts->post_content.'<br>';
            echo 'Post Date: '.$wpPostsDate->format('jS F Y').'<br><br>';
        }
        ?>

【问题讨论】:

    标签: php arrays wordpress foreach


    【解决方案1】:

    有时你只需要一个简单的方法:

    require_once('dbConfig.php');
                // This variable grabs the name in the URL
                $r = get_permalink();
                $r = explode('/', $r);
                $r = array_filter($r);
                $r = array_merge($r, array()); //reset keys
                $code = $r[3];
    
                $getName = preg_replace("/[^a-zA-Z0-9\s]/", "", $code);
                $name = $db->real_escape_string($getName);
    
                $pages = get_posts('meta_key=post_author&meta_value='.$name.'&post_type=post&post_status=publish');
    
                $output = '';
    
                foreach($pages as $value){
    
                    $output .= "<h1>".$value->post_title."</h1>";
                    $output .= "<p>".$value->post_content."</p>";
                } 
    
                echo $output;
    

    完全按照我的意愿工作:)

    【讨论】:

      【解决方案2】:

      在运行 select 查询之前,首先确保您在 $name 中有准确的值,然后尝试像这样的单个连接查询:

      $sql = $wpdb->prepare("
              SELECT
                p.post_title, p.post_content, p.post_date_gmt
              FROM
                $wpdb->posts p
              RIGHT JOIN $wpdb->postmeta pm ON (pm.post_id = p.ID)
              WHERE pm.meta_value = %s AND p.post_status = 'publish'
              AND p.post_type = 'post' ORDER BY p.ID DESC
          ", $name);
      
      $allposts = $wpdb->get_results($sql);
      
      foreach ($allposts as $singlepost) {
          $singlepostDate = new DateTime($singlepost->post_date_gmt);
          echo '<h1>'.$singlepost->post_title.'</h1><br>';
          echo 'Post Content: '.$singlepost->post_content.'<br>';
          echo 'Post Date: '.$singlepostDate->format('jS F Y').'<br><br>';
      }
      

      【讨论】:

      • 您好,我刚刚尝试过以 andy 作为名称,因为我知道我写了一两篇文章并且我被列为文章作者(meta_key = post_author & meta_value = andy)但是什么都不显示。有什么想法吗?
      • 另外,如果我这样做 print_r($allposts);我得到了看起来不正确的 Array ( )
      • 别担心,我找到了一个非常简单的方法,谢谢你的帮助:)
      • @AndyHolmes 很棒的安迪。同样作为您的第二条评论,我通过更改为RIGHT JOIN 更新了我的答案。我认为应该返回相同的结果。也许……
      • 太好了,谢谢 :) 至少我有另一种方法。感谢您的所有帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2015-07-13
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多