Wednesday, May 18th, 2022

फ़िल्टर करने के बाद पोस्ट सूची तालिका में पोस्ट की सही संख्या प्रदर्शित करें – डीलक्स ब्लॉग टिप्स

वर्डप्रेस एडमिन में, जब आप सभी पोस्ट स्क्रीन पर जाते हैं, तो आपको सभी पोस्ट की एक टेबल दिखाई देगी। उस स्क्रीन पर आप भी देखें पोस्ट की स्थिति के अनुसार पदों की संख्या (वर्डप्रेस इसे टेबल व्यू कहते हैं)। और आप पोस्ट के लिए अपने स्वयं के फ़िल्टर भी जोड़ सकते हैं। समस्या यह है कि वर्डप्रेस पोस्ट की सही संख्या नहीं दिखाता है बाद में छानना इसके बजाय, यह हमेशा पदों की संख्या दिखाता है के बग़ैर छानना

इसे ठीक करने के लिए, हमें करना होगा हमारे कस्टम तालिका दृश्य लिखें वर्तमान फ़िल्टर के साथ स्थिति के आधार पर पदों की संख्या को क्वेरी करने के लिए।

कस्टम तालिका दृश्य बनाएं

कस्टम तालिका दृश्य जोड़ने के लिए, इस कोड का उपयोग करें:

add_filter( "views_edit-{$post_type}", 'dbt_get_views' );
function dbt_get_views( $views ) {
    // Our code here
    return $views;
}

बदलने के $post_type अपने स्वयं के पोस्ट प्रकार स्लग के साथ।

पदों की संख्या प्राप्त करें

वर्तमान फ़िल्टर प्राप्त करने के लिए, हम या तो उस क्वेरी को फिर से बना सकते हैं जिसका उपयोग हम पोस्ट को फ़िल्टर करने के लिए करते हैं। और फिर प्राप्त करें सब पोस्ट करें, और उन्हें स्थिति के अनुसार समूहित करें। लेकिन यह बहुत धीमी क्वेरी बनाता है, क्योंकि हमें सभी पोस्ट को क्वेरी करना होता है।

एक बेहतर तरीका हमारी अपनी SQL क्वेरी को यथासंभव न्यूनतम डेटा के साथ बनाना है। SQL का उपयोग करते हुए, हमें SQL में वर्तमान फ़िल्टर प्राप्त करने होंगे। वैश्विक के लिए धन्यवाद $wp_query, हम इसे वर्तमान क्वेरी से निम्नानुसार निकाल सकते हैं:

global $wpdb, $wp_query;

$sql = $wp_query->request;

if ( strpos( $sql, 'FROM' ) !== false ) {
	list ( , $sql ) = explode( 'FROM', $sql );
}
if ( strpos( $sql, 'GROUP' ) !== false ) {
	list ( $sql ) = explode( 'GROUP', $sql );
}
if ( strpos( $sql, 'ORDER' ) !== false ) {
	list ( $sql ) = explode( 'ORDER', $sql );
}

$data = $wpdb->get_results( "SELECT post_status, count(ID) AS count FROM $sql GROUP BY post_status" );

पूर्ण SQL में निम्न प्रारूप है:

SELECT ... FROM ... [INNER JOIN ...] WHERE ... [GROUP BY ...] [ORDER BY ...]

हमें केवल भाग प्राप्त करने की आवश्यकता है:

FROM ... [INNER JOIN ...] WHERE ... 

इसलिए हम ऊपर कुछ string functions का उपयोग करते हैं। और फिर हम केवल . का चयन करते हैं post_status और पदों की संख्या (count(ID)) और उन्हें द्वारा समूहित करें post_status.

तालिका दृश्य बनाएं

और अब हम निम्नलिखित कोड के साथ तालिका दृश्य बना सकते हैं:

$total = array_sum( wp_list_pluck( $data, 'count' ) );

$views = [
	'all' => sprintf(
		'<a href="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s" class="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s">%s <span class="count">(%d)</span></a>',
		esc_url( admin_url( "edit.php?post_type={$this->post_type}" ) ),
		empty( $_GET['post_status'] ) ? '' : 'current',
		'All',
		$total
	),
];
$labels = [
	'publish' => 'Publish',
	'draft'   => 'Draft',
	'trash'   => 'Trash',
	'custom-status' => 'Custom status',
];
foreach ( $data as $item ) {
	$label = $labels[ $item->post_status ];
	$views[ $item->post_status ] = sprintf(
		'<a href="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s" class="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s">%s <span class="count">(%d)</span></a>',
		esc_url( admin_url( "edit.php?post_type={$post_type}&post_status={$item->post_status}" ) ),
		isset( $_GET['post_status'] ) && $_GET['post_status'] === $item->post_status ? 'current' : '',
		$label,
		$item->count
	);
}

ध्यान दें कि आपको उपलब्ध स्थितियों के लिए सभी लेबल सूचीबद्ध करने होंगे $labels चर। इसमें कस्टम पोस्ट स्थितियां शामिल हो सकती हैं।

फिर से, प्रतिस्थापित करना न भूलें $post_type आपके पोस्ट टाइप स्लग के साथ।

अंतिम कोड

यहाँ पूरा कोड है:

<?php
add_filter( "views_edit-{$post_type}", 'dbt_get_views' );
function dbt_get_views( $views ) {
	global $wpdb, $wp_query;

	$sql = $wp_query->request;

	if ( strpos( $sql, 'FROM' ) !== false ) {
		list ( , $sql ) = explode( 'FROM', $sql );
	}
	if ( strpos( $sql, 'GROUP' ) !== false ) {
		list ( $sql ) = explode( 'GROUP', $sql );
	}
	if ( strpos( $sql, 'ORDER' ) !== false ) {
		list ( $sql ) = explode( 'ORDER', $sql );
	}

	$data = $wpdb->get_results( "SELECT post_status, count(ID) AS count FROM $sql GROUP BY post_status" );

	$total = array_sum( wp_list_pluck( $data, 'count' ) );

	$views = [
		'all' => sprintf(
			'<a href="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s" class="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s">%s <span class="count">(%d)</span></a>',
			esc_url( admin_url( "edit.php?post_type={$this->post_type}" ) ),
			empty( $_GET['post_status'] ) ? '' : 'current',
			'All',
			$total
		),
	];
	$labels = [
		'publish' => 'Publish',
		'draft'   => 'Draft',
		'trash'   => 'Trash',
		'custom-status' => 'Custom status',
	];
	foreach ( $data as $item ) {
		$label = $labels[ $item->post_status ];
		$views[ $item->post_status ] = sprintf(
			'<a href="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s" class="https://deluxeblogtips.com/wordpress-display-correct-number-of-posts-in-posts-list-table-after-filtering/%s">%s <span class="count">(%d)</span></a>',
			esc_url( admin_url( "edit.php?post_type={$post_type}&post_status={$item->post_status}" ) ),
			isset( $_GET['post_status'] ) && $_GET['post_status'] === $item->post_status ? 'current' : '',
			$label,
			$item->count
		);
	}

	return $views;
}

Source link