0

特定の年の投稿を表示するテンプレート ファイルがあります。機能していますが、サイトにいくつかの投稿の重複があり、それらを削除することはできません。したがって、私の問題は、生成されたリストに 2 つの異なる投稿が表示されているが、内容が同じであることです。post_title がすでにページに印刷されているかどうかをテストできるはずだと考えていますが、成功していません。だから今、私は助けを求めています。以下は私のテンプレートファイルです。

        <?php
/* Template Name: 2012 */

get_header();

?>


<?php
    $post_titles = array();
    $year = isset($_GET['y']) ? $_GET['y'] : date('Y');
    if($year == date('Y')){
        $posts = get_newest_posts();
    }
    else{
        $posts = get_yearly_posts($year);
    } ?>
    <div class="site-content-wrapper site-content-blog-wrapper container columns clearfix archive">
    <article id="primary-wrapper" class="eight column">
    <div class="post-blog inner">
    <h2 class="entry-title"><a href="#">News <?= $year ?></a></h2>
    <?php foreach($posts as $post): ?>

    /*  here i would like a test to see if a post with a similar title already has 
        printet to page. if it has not the code below should run and print post to page. */

        <div class="archive-post">
        <table width="100%" border="0" cellspacing="0" cellpadding="0">
        <tbody><tr>
            <td width="100%"><span class="STRONG"><a href="<?= bloginfo('url') ?>/?p=<?= $post->ID ?>" target="_top"><?= $post->post_title ?></a></span></td>
        </tr>
        <tr>
            <td><span class="norm">
                <?php if($year != date('Y')): ?>
                    <?= $post->search_plus_description ?>
                <?php else: ?>
                    <?= $post->post_excerpt ?>
                <?php endif ?>
            </span></td>
        </tr>
        <tr>
            <td>
                <span class="norm">
                    <?= $year == date('Y') ? date('d F Y', strtotime($post->post_date)) : date('d F Y', strtotime($post->publication_date)) ?>
                </span>
            </td>
        </tr>
        <tr>
            <td><img src="x.gif" width="1" height="10" alt=""></td>
        </tr>
        </tbody></table>
        </div>

    <?php endforeach ?>

回答ありがとうございます。$post 配列を実行し、重複のない配列を返す関数を作成しました。それを行うようで、dbから消去しません。ここにコードがあります

function remove_duplicates(array $array){
  $tmp_array = array();
$title_array = array();
$date_array = array();
  foreach($array as $post)  
  {
    $title = $post->post_title;
    $date = $post->post_date;
     if (!(in_array($title, $title_array) && in_array($date, $date_array)))
     {
       $tmp_array[] = $post;
    $title_array[] = $title;
    $date_array[] = $date;
     }
  }
  return $tmp_array;
}
4

2 に答える 2

0

wp_posts テーブルでカスタム SQL クエリを使用して、個別のタイトルとコンテンツを持つ投稿の ID を見つけることができます。その後、WP_Query を使用してこれらの ID を使用し、テンプレート ループで投稿を表示できます。

タイトルに基づいて個別の投稿を提供する例を投稿しています。

$sql = 'select ID,post_title,post_type,post_status from wp_posts group by post_title having (post_status)="publish" AND (post_status)="publish"';
$results = $wpdb->get_results($sql,ARRAY_A);
    $distinctIds = array();
    foreach($results as $result){
            $distinctIds[] = $result['ID'];
    }
$args = array('post_type' => 'post','post__in'=> $distinctIds);
$distinct_posts = new WP_Query($args);
if($distinct_posts->have_posts()) : 
    while($distinct_posts->have_posts()) : 
    $distinct_posts->the_post();
    // your stuff related to post
    // echo content etc..
   endwhile;
endif;

もちろん、WP_Query でカスタム パラメータを使用して、さらに絞り込むこともできます。これが役立つことを願っています。

于 2013-10-01T12:44:24.483 に答える
0

これを試してみてください

global $wpdb;

$duplicate_titles = $wpdb->get_col("SELECT post_title FROM {$wpdb->posts} GROUP BY post_title HAVING COUNT(*) > 1");

foreach( $duplicate_titles as $title ) {
   $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_title=%s", $title ) ); 
   // Iterate over the second ID with this post title till the last
   foreach( array_slice( $post_ids, 1 ) as $post_id ) {
       wp_delete_post( $post_id, true ); // Force delete this post
   }
}
于 2013-10-01T11:23:56.550 に答える