यह पता लगाने का सबसे अच्छा तरीका है कि आप SINGLE POST पृष्ठ में हैं


9

तो यह एक बहुत ही सुंदर बात की तरह लग सकता है, लेकिन मुझे यहाँ का पालन करें।

मैं pre_get_postsकार्रवाई के माध्यम से कुछ तर्क जोड़ने की कोशिश कर रहा हूं । यह पूरी WP_Query वस्तु मुझे दी गई है। (अंत देखें)

जिन चीजों का मैंने उपयोग करने पर विचार किया है:

  • is_single() - बहुत चौड़ा।
  • is_singular()- इसका उपयोग करने के लिए बहुत जल्द, जैसा get_queried_object()कि अभी तक निर्धारित नहीं है।
  • $query->single संपत्ति - फिर से बहुत व्यापक है।
  • $query->get('post_type')- सेट नहीं है, क्योंकि यह nameसंपत्ति का उपयोग कर रहा है।

क्या nameवास्तव में यहाँ एकमात्र संकेतक है?

WP_Query Object
(
    [query] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
        )

    [query_vars] => Array
        (
            [page] => 
            [name] => abcs-of-mental-health
            [error] => 
            [m] => 0
            [p] => 0
            [post_parent] => 
            [subpost] => 
            [subpost_id] => 
            [attachment] => 
            [attachment_id] => 0
            [static] => 
            [pagename] => 
            [page_id] => 0
            [second] => 
            [minute] => 
            [hour] => 
            [day] => 0
            [monthnum] => 0
            [year] => 0
            [w] => 0
            [category_name] => 
            [tag] => 
            [cat] => 
            [tag_id] => 
            [author_name] => 
            [feed] => 
            [tb] => 
            [paged] => 0
            [comments_popup] => 
            [meta_key] => 
            [meta_value] => 
            [preview] => 
            [s] => 
            [sentence] => 
            [fields] => 
            [menu_order] => 
            [category__in] => Array
                (
                )

            [category__not_in] => Array
                (
                )

            [category__and] => Array
                (
                )

            [post__in] => Array
                (
                )

            [post__not_in] => Array
                (
                )

            [tag__in] => Array
                (
                )

            [tag__not_in] => Array
                (
                )

            [tag__and] => Array
                (
                )

            [tag_slug__in] => Array
                (
                )

            [tag_slug__and] => Array
                (
                )

            [post_parent__in] => Array
                (
                )

            [post_parent__not_in] => Array
                (
                )

        )

    [tax_query] => 
    [meta_query] => 
    [queried_object] => 
    [queried_object_id] => 0
    [post_count] => 0
    [current_post] => -1
    [in_the_loop] => 
    [comment_count] => 0
    [current_comment] => -1
    [found_posts] => 0
    [max_num_pages] => 0
    [max_num_comment_pages] => 0
    [is_single] => 1
    [is_preview] => 
    [is_page] => 
    [is_archive] => 
    [is_date] => 
    [is_year] => 
    [is_month] => 
    [is_day] => 
    [is_time] => 
    [is_author] => 
    [is_category] => 
    [is_tag] => 
    [is_tax] => 
    [is_search] => 
    [is_feed] => 
    [is_comment_feed] => 
    [is_trackback] => 
    [is_home] => 
    [is_404] => 
    [is_comments_popup] => 
    [is_paged] => 
    [is_admin] => 
    [is_attachment] => 
    [is_singular] => 1
    [is_robots] => 
    [is_posts_page] => 
    [is_post_type_archive] => 
    [query_vars_hash] => f473ebf7f725c2627dc5fd9a1429f626
    [query_vars_changed] => 
    [thumbnails_cached] => 
)

जवाबों:


10

मैंने अपने उद्देश्यों के लिए इसे पहले छांटने की कोशिश की है। जहाँ तक मैं बता सकता हूं ...

  • post_typeवास्तव में postपोस्ट प्रकार के लिए कहीं भी सेट नहीं है ।
  • के लिए pageपोस्ट प्रकार मैं केवल में पोस्ट प्रकार कुंजी देखने queried_object
  • CPT प्रकारों के लिए और इसमें भी एक post_typeकुंजी query_varsहै query
  • नव मेनू इस संबंध में अन्य सीपीटी की तरह व्यवहार करते दिखाई देते हैं।

डेटा बहुत असंगत है लेकिन अगर आप पृष्ठों को समाप्त करते हैं और सीपीटी का मानना ​​है कि आप इस postप्रकार का अनुमान लगा सकते हैं ।

संपादित करें: @ EricHolmes से कार्य कोड:

add_action( 'pre_get_posts', 'something_for_single_posts_only' ) ; 
function something_for_single_posts_only( $query ) { 
  if( $query->is_main_query() 
    && $query->is_singular() 
    && ! $query->get( 'post_type' ) 
    && ! $query->is_page() 
    && ! $query->is_attachment() 
  ) { 
      // do something for single posts only. 
  } 
} 

हम is_singular के लिए जांचते हैं, कोई पोस्ट प्रकार (CPTs post_typeमें query_varsनहीं है), एक पृष्ठ या अनुलग्नक नहीं।


और यह अंदर काम करता है pre_get_posts(क्वेरी रन से पहले)?
gmazzap

मुझे आश्चर्य है कि क्या स्तर is_page()पर सेट pre_get_postsहै। यदि यह है, और मैं post_typequery_vars में सेट नहीं होने के खिलाफ जांच कर सकता हूं, तो मुझे लगता है कि यह उतना ही अच्छा है जितना इसे मिलता है? इसलिए टूट गया।
एरिक होम्स

1
is_pageसेट होने लगता है।
s_ha_dum

@s_ha_dum मैं टिप्पणी हटा क्योंकि ऐसा लगता है सीपीटी लिए काम नहीं करता है ...
gmazzap

2
अपने उत्तर में कार्यशील समाधान जोड़ना।
एरिक होम्स

0

मुझे नहीं पता कि क्या यह उपयोगी होगा:

function hwl_home_pagesize( $query ) {
    global $wp_query;
    if (is_main_query() && count($wp_query->posts) < 2) {

    }

}
add_action( 'pre_get_posts', 'hwl_home_pagesize', 1 );

पोस्ट प्रकार की जाँच करने के लिए $ wp_query-> पोस्ट (सरणी) का उपयोग करें।


अभी नहीं। इससे पहले कि $wp_query->postsवास्तव में चर आबादी है पहले से पोस्ट हो जाता है। हालांकि धन्यवाद!
एरिक होम्स

0

कुछ परीक्षणों के बाद मैं देखता हूं कि दुर्भाग्य से अंदर के प्रकार के पोस्ट को प्राप्त करना असंभव है pre_get_posts हुक के । केवलis_page काम करता है, लेकिन मानक पोस्ट प्रकार और न ही cpt को पुनः प्राप्त किया जा सकता है।

यदि आपके पास केवल पृष्ठ और पोस्ट (कोई cpt) नहीं है, तो is_single()साथ में चेक करेंtrue प्रतिक्रिया साधन के रूप में पोस्ट प्रकार, पोस्ट है कि क्योंकि वह उन पृष्ठों के लिए रिटर्न फाल्स।

यदि आपके पास CPT भी है, तो मुझे डर है कि आपको एक अतिरिक्त क्वेरी करनी होगी । सबसे सरल मैं सोच सकता हूं कि बस वह post_typeकॉलम प्राप्त करें जहां पोस्ट की स्थिति प्रकाशित है और पोस्ट_नाम एक आवश्यक है (रिवाइजिंग रिवाइज करना):

function test( $q ) {
  if ( is_single() ) {
    global $wpdb;
    $type = $wpdb->get_var( $wpdb->prepare(
      "SELECT post_type FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type <> 'revision'",
      $q->query['name']
    ) );
    var_dump($type);
  }
}
add_action( 'pre_get_posts', 'test', 1); 

यदि आप एक विशिष्ट पोस्ट प्रकार की जांच करना चाहते हैं, तो आप एक कस्टम सशर्त टैग लिख सकते हैं जो किसी दिए गए पोस्ट_ टाइप और दिए गए नाम के साथ पंक्तियों को गिनते हैं:

function is_single_post_type( $type = 'post' ) {
  if ( is_single() ) {
    global $wpdb, $wp_query;
    $is = $wpdb->get_var( $wpdb->prepare(
      "SELECT count(ID) FROM $wpdb->posts WHERE post_name = %s AND post_status = 'publish' AND post_type = %s",
      $wp_query->query['name'], $type
    ) );
    return $is > 0;
  }
  return false;
}

बेशक इस पर जरूरत है pre_get_post, किसी भी बाद में हुक आप उपयोग कर सकते हैं get_post_type()...


1
यह निश्चित रूप से काम करेगा, लेकिन स्वीकृत उत्तर में देखें, यह डेटाबेस के लिए एक अतिरिक्त प्रश्न के बिना बहुत कम जटिल सशर्त है। :)
एरिक होम्स

हाँ। मैं समझता हूं कि आप जानना चाहते थे कि आप किस पोस्ट प्रकार को दिखा रहे हैं। न केवल यदि आप एक ही पोस्ट दृश्य में हैं। @EricHolmes
gmazzap

-1

यह वही है जो मैं उपयोग कर रहा हूं, हालांकि यह मेरी अपनी निर्देशिका संरचना के लिए विशिष्ट है।

/**
 * Function to list all templates used in a page
 * @author Imperative Ideas with thanks to Rarst
 * @uri http://wordpress.stackexchange.com/a/89005
 */

function thelist() {
    $included_files = get_included_files();
    $stylesheet_dir = str_replace( '\\', '/', get_stylesheet_directory() );
    $template_dir   = str_replace( '\\', '/', get_template_directory() );
    echo '<h3 class="debugtitle">Theme file templates used in this page</h3>';
    foreach ( $included_files as $key => $path ) {

        $path   = str_replace( '\\', '/', $path );

        if ( false === strpos( $path, $stylesheet_dir ) && false === strpos( $path, $template_dir ) )
            unset( $included_files[$key] );

        if(!strpos($path, '/wp-content/themes/') === false) { // Files IN this directory
            if(strpos($path, '/library/') === false) { // Ignore this subdir
                if(strpos($path, '/hybrid-core/') === false) { // Ignore this subdir
                    echo $key." = ". $path."</br>"; // Finally, output the list
                }
            }
        }
    }
}

माइलेज अलग हो सकता है। स्ट्रैप्स बिट्स जहां मैं जांचता हूं कि फाइलें एक निर्देशिका में हैं, लेकिन दूसरे को आपके निर्माण के लिए संशोधित करने की आवश्यकता नहीं है और संभवतः अधिक कुशलता से फिर से फैक्टर किया जा सकता है। वे एक निश्चित निर्देशिका संरचना के ऊपर और नीचे के परिणामों को काटने के लिए मौजूद हैं।

पाद लेख में सूची () चलाने से आपको वर्तमान दृश्य को संकलित करने के लिए उपयोग की जाने वाली प्रत्येक .php टेम्पलेट फ़ाइल की एक क्रमांकित सूची मिल जाएगी। यह विशेष रूप से उपयोगी है जब एक बच्चे के विषय से निपटने के लिए जो एक रहस्य घटक प्रदान कर रहा है।


ओवरकिल लगता है। हालांकि कूल विचार?
एरिक होम्स

यह निर्धारित करने के लिए बहुत सारे अच्छे तरीके नहीं हैं कि कौन से टेम्पलेट पृष्ठ को चला रहे हैं, उन्हें पार्स करने के अलावा। मुझे लगता है कि यदि आप एकल बनाम पृष्ठ के रूप में सरल के लिए कुछ देख रहे हैं, तो हाँ, यह ओवरकिल है। फ़ंक्शन को कुछ समय चलाने का प्रयास करें, हालांकि, अतिरिक्त अनदेखी शर्तों को घटाते हैं, और आप देखेंगे कि मैं इसका उपयोग क्यों करता हूं। ऐसी TON फाइलें हैं जो WP पेज को चलाती हैं और यह जानना वास्तव में उपयोगी हो सकता है कि वे सभी क्या हैं। हालांकि यह हुक किए गए कार्यों की पहचान नहीं करेगा।
इंपीरियल विचार 19
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.