programing

워드프레스:위젯 $args 내에서 할당된 게시 ID를 제외하는 사용자 지정 루프

lastmoon 2023. 3. 8. 21:44
반응형

워드프레스:위젯 $args 내에서 할당된 게시 ID를 제외하는 사용자 지정 루프

위젯 등록 완료function.php정의된 post_id 메타를 표시합니다.

class featured_widget extends WP_Widget
{
  /**
     * Display front-end contents.
     */
    function widget($args, $instance)
    {
        $post = get_post($instance['post_id']);
...
}

}

할당된 것을 제외합니다.post_id$post내 루프에서:

if (have_posts()) : while (have_posts()) : the_post();

1. 의 입수방법post_id가치?

WordPress는 옵션테이블에 위젯 데이터를 저장합니다.option_namewidget_{$id_base}예를 들어 다음과 같은 위젯을 작성하는 경우:

function __construct() {
    parent::__construct('so37244516-widget',
        __('A label', 'text-domain'), [
        'classname'   => 'so37244516-widget-class',
        'description' => __('Some descriptions', 'text-domain')
    ]);
}

option_name그래야 한다widget_so37244516-widget위젯 데이터를 가져오려면 다음을 사용해야 합니다.

$data = get_option('widget_so37244516-widget');

그러나 위젯에는 여러 인스턴스가 있을 수 있기 때문에$data는 예측할 수 없는 키를 가진 관련 배열입니다(위젯을 사이드바에 끌어다 저장할 때마다 위젯의 새 인스턴스가 반환됩니다).

따라서 사이트 전체에 위젯 인스턴스가 하나만 있는 경우$data[2]['post_id']우리가 필요로 하는 가치입니다.인스턴스가 여러 개 있는 경우 루프를 통해$data몇 가지 키와 값을 비교하여 올바른 키를 찾습니다.늘 그렇듯이var_dump($data)많은 도움이 됩니다.

2. 의 직책은 제외한다.post_id루프를 통과합니다.

가정하다$exclude_id1단계에서 얻은 값입니다.

  1. 커스텀 루프를 실행하고 있는 경우는, @hemnath_mouli 의 메서드를 사용합니다.
$query = new WP_Query([
    'post__not_in' => [$exclude_id]
]);

if ( $query->have_posts() ) :
    while ( $query->have_posts() ) : $query->the_post();
        // Do loop.
    endwhile;
    wp_reset_query(); // Must have.
else :
    // Do something.
endif;

잊지 말고 해 주세요wp_reset_query().

  1. 디폴트 루프를 사용하고 있는 경우는, @Deepti_chipdey 의 메서드를 사용해 주세요.functions.php:
add_action('pre_get_posts', function($query)
{
    if ( $query->is_home() && $query->is_main_query() ) {
        $query->set('post__not_in', [$exclude_id]);
    }
});

꼭 변경해주세요is_home()원하는 페이지로 이동합니다.

pre-get posts 훅을 사용해야 합니다.

Tyr 이 코드

function exclude_single_posts_home($query) {
  if ($query->is_home() && $query->is_main_query()) {
    $query->set('post__not_in', array($post));
   }
}

add_action('pre_get_posts', 'exclude_single_posts_home');

투고를 제외하려면 다음 명령을 사용해야 합니다.post__not_inWP_Query에서

$post = new WP_Query( array( 'post__not_in' => array( $exclude_ids ) ) );

이게 도움이 됐으면 좋겠어!

1개의 투고를 제외하는 경우는, 상기의 순서에 따릅니다.

단, post id를 별도로 부여하지 않는 한, 카테고리에서 제외시키고 싶은 모든 게시물을 간단한 방법으로만 만듭니다.

일부 카테고리에서 투고 제외

    <?php $query = new WP_Query( 'cat=-3,-8' ); ?>// 3 and 8 are category id

상세한 예

    <?php $query = new WP_Query( 'cat=-3,-8' ); ?>
    <?php if ( $query->have_posts() ) : while ( $query->have_posts() ) : $query->the_post(); ?>

    <div class="post">

    <!-- Display the Title as a link to the Post's permalink. -->
     <h2><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></h2>

    <!-- Display the date (November 16th, 2009 format) and a link to other posts by this posts author. -->
   <small><?php the_time( 'F jS, Y' ); ?> by <?php the_author_posts_link(); ?></small>

    <div class="entry">
     <?php the_content(); ?>
    </div>

     <p class="postmetadata"><?php _e( 'Posted in' ); ?> <?php the_category( ', ' ); ?></p>
     </div> <!-- closes the first div box -->

     <?php endwhile; 
          wp_reset_postdata();
          else : ?>
          <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
      <?php endif; ?>

참조 링크:클릭해주세요

언급URL : https://stackoverflow.com/questions/37244516/wordpress-custom-loop-to-exclude-post-id-assigned-within-widget-args

반응형