显示同一类别下的帖子

时间:2014-10-08 22:11:05

标签: php mysql wordpress hyperlink categories

我对wordpress和博客都很陌生。我正在开发一个博客门户网站,其中包含多个博客,但它们都使用网站主页上列出的常见类别。问题是,无论我在主页面上选择哪个类别,它都会向我显示具有完全相同帖子的页面。 这是我的代码:

<div class="category-holder list-center">
                <h5>Kategoriat</h5>
                <?php $site_url = get_bloginfo( 'wpurl' ); ?>
                <a target="_blank" href="<?php $site_url; ?>/tags/?avain=<?php the_field('cat1'); ?>"><?php the_field('cat1'); ?></a><br/>
                <a target="_blank" href="<?php $site_url; ?>/tags/?avain=<?php the_field('cat2'); ?>"><?php the_field('cat2'); ?></a><br/>
                <a target="_blank" href="<?php $site_url; ?>/tags/?avain=<?php the_field('cat3'); ?>"><?php the_field('cat3'); ?></a><br/>
                <a target="_blank" href="<?php $site_url; ?>/tags/?avain=<?php the_field('cat4'); ?>"><?php the_field('cat4'); ?></a><br/>
                <a target="_blank" href="<?php $site_url; ?>/tags/?avain=<?php the_field('cat5'); ?>"><?php the_field('cat5'); ?></a>
            </div>

你能否建议一些PHP功能,或者给我任何提示我应该做什么,我应该在哪里寻找这个问题的解决方案?我希望你明白我只是一个初学者,我想了解更多关于节目。 提前谢谢!

更新:我还有一个functions.php文件,这部分代码可能是相关的:

function tag_posts() {
    global $wpdb;
    $tag = $_GET['avain'];
    $taxarr = array();
    $postarr = array();
    $blogs = $wpdb->get_results( "SELECT blog_id FROM {$wpdb->blogs} WHERE blog_id != {$wpdb->blogid} AND site_id = '{$wpdb->siteid}'  AND spam = '0' AND deleted = '0' AND archived = '0'", ARRAY_A);
    array_unshift($blogs, 1); 
    foreach($blogs as $blog) {
        $wpdb->set_blog_id($blog[ 'blog_id' ]);
        $tax_id = $wpdb->get_var("SELECT term_taxonomy_id FROM $wpdb->term_taxonomy WHERE term_id IN (SELECT term_id FROM $wpdb->terms WHERE name='$tag')");
        $post_id = $wpdb->get_results("SELECT object_id FROM $wpdb->term_relationships WHERE term_taxonomy_id = $tax_id");
        foreach ($post_id as $id) {
            $postarr = $id->object_id;
        }

        $posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE ID IN ($postarr)");
        global $post;
        foreach ($posts as $post):setup_postdata($post); 

            '<div class="post"><header class="post-header"><div class="date-holder"><span>'.the_time('F jS, Y').'</span></div>';
            '<a href="'.$post->guid.'">'.$post->post_title.'</a></header>';
            '<div class="post-content">'.the_content().'</div></div>';
        endforeach;
    }
}

2 个答案:

答案 0 :(得分:0)

请在这里看一下这个循环:

foreach ($post_id as $id) {
    $postarr = $id->object_id;
}

$posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE ID IN ($postarr)");

您查询帖子时$postarr的预期值似乎是具有帖子ID的数组。但是,执行$postarr = $id->object_id;时,您将覆盖分配给它的变量仅结果集中的最后一个 ID,结果是整数变量而不是数组。

所以我会建议这样的事情:

foreach ($post_id as $id) {
    $postarr[] = $id->object_id; 
}

$postsAsCommaSepString = implode( ',', $postarr ); 

$posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE ID IN ($postsAsCommaSepString)");

首先我们在$postarr添加条目,注意括号:

 $postarr[] = $id->object_id;

然后,由于我们不能像使用字符串一样使用数组变量,因此我们需要创建一个字符串作为逗号分隔的ID列表,以便在SQL IN中使用。为此,我们使用逗号作为分隔符将数组内爆为字符串:

$postsAsCommaSepString = implode( ',', $postarr );

最后,我们在查询中使用这个新的字符串变量:

$posts = $wpdb->get_results("SELECT * FROM {$wpdb->prefix}posts WHERE ID IN ($postsAsCommaSepString)");

这应该解决每次获取相同帖子的问题。

编辑:查询错误:

此查询中还存在一个问题:

$blogs = $wpdb->get_results( "SELECT blog_id FROM {$wpdb->blogs} WHERE blog_id != {$wpdb->blogid} AND site_id = '{$wpdb->siteid}'  AND spam = '0' AND deleted = '0' AND archived = '0'", ARRAY_A);

在SQL中, not equal 运算符与<>而不是!=类似。请参阅下面更正的表格:

$blogs = $wpdb->get_results( "SELECT blog_id FROM {$wpdb->blogs} WHERE blog_id <> {$wpdb->blogid} AND site_id = '{$wpdb->siteid}'  AND spam = '0' AND deleted = '0' AND archived = '0'", ARRAY_A);

答案 1 :(得分:0)

请按照步骤操作。这可能会对你有帮助。

  1. Dashboard&gt;中创建新菜单Appearance&gt; Menus
  2. 在菜单中添加类别。
  3. 使用功能wp_nav_menu()显示菜单。
  4. 显示的菜单中的类别链接将引导您进入相应的类别页面。
  5. 请注意,当且仅当您的主题文件夹中存在category.php页时,类别链接会将您引导至相应的类别页面。