मैं दो कस्टम पोस्ट प्रकारों के बीच संबंध कैसे बनाऊं?


16

मैं वर्डप्रेस का उपयोग करके एक टीवी श्रृंखला डेटाबेस बनाना चाहता हूं। मैंने कुछ ट्यूटोरियल का अनुसरण किया है और मेरे पास दो कस्टम पोस्ट प्रकार हैं: एक के लिए movies, एक के लिए और series। मैंने संरचना के लिए इस पोस्ट का पालन ​​किया ।

मेरा सवाल है: मैं फिल्मों और श्रृंखला पोस्ट प्रकारों के बीच संबंध कैसे बना सकता हूं?


सबसे पहले, आप एक संपूर्ण डेटाबेस नहीं बना रहे हैं , आप केवल एक वर्डप्रेस 'कस्टम पोस्ट टाइप' बना रहे हैं। और वर्डप्रेस दायरे में आपके पास उन्हें वर्गीकृत करने, उन्हें छाँटने आदि के कई अवसर हैं और ये सभी एक अच्छे आंतरिक संबंध के साथ किए जाते हैं। इसलिए, जिस रिश्ते के बारे में आप बात कर रहे हैं, वह पहले से ही है, आपको बस इसे उस तरीके से लागू करना होगा, जिस तरह से आपको ज़रूरत है। इसलिए, मैं आपको सुझाव दूंगा कि आप post_type को निर्देशन के रूप में लागू करें, और फिर प्रश्न को अपनी वास्तविक क्वेरी के साथ संपादित करें।
मयिनुल इस्लाम

@MayeenulIslam, "implement the post_type as directed"क्या मतलब है आपका?
CoalaArmy

जैसा कि आपके प्रदान किए गए लिंक-थ्रेड में या एक साधारण जनरेटर का उपयोग करके निर्देशित किया गया है : यह पोस्ट टाइप जेनरेटर
मयिनुल इस्लाम

@MayeenulIslam: मुझे विश्वास नहीं हो रहा है कि "जिस रिश्ते के बारे में आप बात कर रहे हैं, वह पहले से ही है"। डिफ़ॉल्ट रूप से, विभिन्न प्रकार के पोस्ट के बीच कोई सीधा संबंध नहीं है।
s_ha_dum 15

@s_ha_dum क्षमा करें, मैंने उनके प्रश्न के कुछ हिस्से को याद किया जहां उन्होंने पहले ही कहा था कि उनके पास दो पोस्ट_टाइप्स हैं। यह मेरी गलती है। मैं उसे अपने विवरण के साथ स्पष्ट करने की कोशिश कर रहा हूं। मुझे याद आया कि विस्तार पहले से ही है। :( मैं परिभाषित किया गया है कि टैक्सोनॉमी और कस्टम पोस्ट प्रकार के आंतरिक संबंध के बारे में बात कर रहा हूं।
मयेनुल इस्लाम

जवाबों:


22

एक प्लगइन का उपयोग करना

रिश्तों के लिए कुछ बहुत अच्छे प्लगइन्स:

एक मेटाबॉक्स का उपयोग करना

आप मेटाबोक्स का उपयोग करके एक साधारण संबंध बना सकते हैं:

add_action( 'admin_init', 'add_meta_boxes' );
function add_meta_boxes() {
    add_meta_box( 'some_metabox', 'Movies Relationship', 'movies_field', 'series' );
}

function movies_field() {
    global $post;
    $selected_movies = get_post_meta( $post->ID, '_movies', true );
    $all_movies = get_posts( array(
        'post_type' => 'movies',
        'numberposts' => -1,
        'orderby' => 'post_title',
        'order' => 'ASC'
    ) );
    ?>
    <input type="hidden" name="movies_nonce" value="<?php echo wp_create_nonce( basename( __FILE__ ) ); ?>" />
    <table class="form-table">
    <tr valign="top"><th scope="row">
    <label for="movies">Movies</label></th>
    <td><select multiple name="movies">
    <?php foreach ( $all_movies as $movie ) : ?>
        <option value="<?php echo $movie->ID; ?>"<?php echo (in_array( $movie->ID, $selected_movies )) ? ' selected="selected"' : ''; ?>><?php echo $movie->post_title; ?></option>
    <?php endforeach; ?>
    </select></td></tr>
    </table>
}

add_action( 'save_post', 'save_movie_field' );
function save_movie_field( $post_id ) {

    // only run this for series
    if ( 'series' != get_post_type( $post_id ) )
        return $post_id;        

    // verify nonce
    if ( empty( $_POST['movies_nonce'] ) || !wp_verify_nonce( $_POST['movies_nonce'], basename( __FILE__ ) ) )
        return $post_id;

    // check autosave
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    // check permissions
    if ( !current_user_can( 'edit_post', $post_id ) )
        return $post_id;

    // save
    update_post_meta( $post_id, '_movies', array_map( 'intval', $_POST['movies'] ) );

}

और फिर, श्रृंखला के पदों के लिए एक सूची के रूप में फिल्मों के रिश्ते को पाने के लिए:

$series = new WP_Query( array(
    'post_type' => 'movies',
    'post__in' => get_post_meta( $series_id, '_movies', true ),
    'nopaging' => true
) );

if ( $series-> have_posts() ) { while ( $series->have_posts() ) {
    $series->the_post();
    ?>
    <li><a href="<?php the_permalink(); ?>"><?php the_title(); ></a></li>
    <?php
} }

3
मुझे मेटाबोक्स के साथ विचार पसंद है (प्लगइन्स से बचने की कोशिश)!
CoalaArmy

एक और पोस्ट बनाए बिना, क्या हम इसे इस अभिभावक / बाल संबंध से एक पर्मलिंक बनाने के लिए जोड़ सकते हैं? उदाहरण के लिए http://domain.com/series-name/movie-name:?
Xtremefaith

@Xtremefaith यह अन्य कोड के साथ किया जा सकता है। वहाँ एक प्लगइन है जो मैंने श्रेणियों के लिए बनाया है। शायद आप एक संदर्भ के रूप में उपयोग कर सकते हैं। wordpress.org/plugins/hierarchical-urls
vmassuchetto

5

मैं डाक 2 पोस्ट की सिफारिश करता हूं प्लगइन , जिसे मैंने अभी उपयोग करना शुरू किया है।

यह जिसका अर्थ है आप लिंक कर सकते हैं, तो आप पोस्ट और पेज प्रकार के बीच कई-से-अनेक संबंध बनाने के लिए अनुमति देता moviesकरने के लिएseries और किसी भी अन्य CPTs आप बना सकते हैं।

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


मैं इसे देख लूंगा।
CoalaArmy

Iwas sth की तलाश में हैं। इसी तरह और विभिन्न समाधान की कोशिश की। मेरा कहना है कि यह (पोस्ट 2 पोस्ट) एकदम सही था, यह वह नहीं हो सकता है जो एक 'गैर-प्रोग्रामर' की तलाश में होगा, लेकिन अगर आप sth के लिए और अधिक देख रहे हैं। अपने टेम्पलेट में उपयोग करने के लिए एक पुस्तकालय की तरह, यह सिर्फ सही है, अच्छी तरह से प्रलेखित है, अच्छी तरह से एकीकृत है, इसे प्राप्त करें! ;)
लार्जन

मैंने पोस्ट संबंधों के लिए एक छोटा सा प्लगइन किया था, लेकिन wordpress.org/plugins/softmixt-relations
Softmixt

2

दुर्भाग्य से, पोस्ट 2 पोस्ट प्लगइन को हटा दिया गया है और अब रखरखाव नहीं किया गया है। उस MB रिलेशनशिप के लिए एक नया वैकल्पिक प्लगइन है । यह पी 2 पी से प्रेरित है और पोस्ट, नियम और उपयोगकर्ताओं के बीच संबंध बनाने के लिए एक समान एपीआई प्रदान करता है।

एमबी रिलेशनशिप डिफ़ॉल्ट रूप से द्वि-दिशात्मक संबंधों का समर्थन करता है और बेहतर प्रदर्शन (पोस्ट मेटा की तुलना में) के लिए रिश्तों को स्टोर करने के लिए कस्टम टेबल का उपयोग करता है (जैसे पी 2 पी)।

यह प्लगइन को देखने लायक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.