WordPress.org

Make WordPress Core

Opened 3 years ago

Closed 7 months ago

#37406 closed enhancement (fixed)

Add ability to specify post_type in post_exists function - post.php

Reported by: sgarza Owned by: swissspidy
Milestone: 5.2 Priority: low
Severity: normal Version: 4.5.3
Component: Posts, Post Types Keywords: has-patch has-unit-tests commit
Focuses: Cc:
PR Number:

Description

Currently post_exists() has no way of refining the query down to a particular post type. Adding a fourth argument to specify a post type would make this function more useful for custom post type development.

<?php
function post_exists($title, $content = '', $date = '', $type = '') {
        global $wpdb;

        $post_title = wp_unslash( sanitize_post_field( 'post_title', $title, 0, 'db' ) );
        $post_content = wp_unslash( sanitize_post_field( 'post_content', $content, 0, 'db' ) );
        $post_date = wp_unslash( sanitize_post_field( 'post_date', $date, 0, 'db' ) );
        $post_type = wp_unslash( sanitize_post_field( 'post_type', $type, 0, 'db' ) );

        $query = "SELECT ID FROM $wpdb->posts WHERE 1=1";
        $args = array();

        if ( !empty ( $date ) ) {
                $query .= ' AND post_date = %s';
                $args[] = $post_date;
        }

        if ( !empty ( $title ) ) {
                $query .= ' AND post_title = %s';
                $args[] = $post_title;
        }

        if ( !empty ( $content ) ) {
                $query .= ' AND post_content = %s';
                $args[] = $post_content;
        }

        if ( !empty ( $type ) ) {
                $query .= ' AND post_type = %s';
                $args[] = $post_type;
        }

        if ( !empty ( $args ) )
                return (int) $wpdb->get_var( $wpdb->prepare($query, $args) );

        return 0;
}

Attachments (5)

37406.patch (1.4 KB) - added by sgarza 3 years ago.
Added suggested patch
37406.2.patch (725 bytes) - added by birgire 2 years ago.
37406.2.test.patch (1.1 KB) - added by birgire 2 years ago.
37406.3.diff (3.0 KB) - added by birgire 21 months ago.
37406.diff (3.0 KB) - added by swissspidy 7 months ago.

Download all attachments as: .zip

Change History (17)

#1 @sgarza
3 years ago

  • Keywords has-patch added

@sgarza
3 years ago

Added suggested patch

#2 @sgarza
3 years ago

  • Keywords needs-unit-tests added

@birgire
2 years ago

#3 @birgire
2 years ago

  • Keywords has-unit-tests added; needs-unit-tests removed

Added two tests in 37406.2.test.patch regarding the post type modifications in 37406.patch.

#4 @birgire
2 years ago

I wonder if this check:

if ( !empty ( $type ) && post_type_exists( $type ) ) {
    $query .= ' AND post_type = %s';
    $args[] = $post_type;
}

should be applied in 37406.patch, to make sure the post type exists?

But it feels unnecessary...

#5 @swissspidy
21 months ago

  • Keywords needs-refresh added
  • Milestone changed from Awaiting Review to Future Release
  • Priority changed from normal to low

Needs some docs improvements (adding stuff like @since) and a refresh to adhere to coding standards. Otherwise this looks reasonable.

@birgire
21 months ago

#6 @birgire
21 months ago

  • Keywords needs-refresh removed

In 37406.3.diff:

  • Refreshed and combined the patch and tests into a single patch.
  • Added @since in the docBlock.
  • Adjusted according to the WPCS.

#7 @swissspidy
21 months ago

  • Milestone changed from Future Release to 5.0
  • Owner set to swissspidy
  • Status changed from new to accepted

#8 @johnbillion
12 months ago

  • Milestone changed from 5.0 to 5.1

#9 @pento
10 months ago

  • Milestone changed from 5.1 to 5.2

#10 @desrosj
7 months ago

@swissspidy are you still interested in shepherding this one? Are you able to handle it in time for 5.2 beta 1 in a few days?

@swissspidy
7 months ago

#11 @swissspidy
7 months ago

  • Keywords commit added

@desrosj Sure. Just updated the patch. Should be good to go now.

#12 @desrosj
7 months ago

  • Resolution set to fixed
  • Status changed from accepted to closed

In 44959:

Posts, Post Types: Add type parameter to post_exists().

This allows post exists checks scoped to a specific post type.

Props sgarza, birgire, swissspidy.
Fixes #37406.

Note: See TracTickets for help on using tickets.