mike
  • 0
Гуру

Заполните раскрывающееся меню настраиваемого поля заголовками сообщений по авторам

  • 0

Просто вхожу в wordpress и многому учусь! Я знаю, как создать настраиваемое поле и использовать его для основных целей. Я пытаюсь сделать немного больше сейчас… Я надеюсь, что кто-то может мне помочь.

Вот сценарий:

На моем сайте есть раздел о компаниях и мероприятиях. Компании используют «сообщения» по умолчанию из WordPress, «события» — это настраиваемый тип сообщений.

Я хочу создать настраиваемое поле для событий, которое заполняет выпадающий список бизнес-сообщений, автором которых является текущий пользователь, эффективно связывая их вместе. Таким образом, пользователь может видеть в списке только бизнес-сообщения, которые он создал, и не может создавать события и связывать их со случайными компаниями.

Я попытался использовать класс «LittlePromoBox», найденный в этом посте. Но мне не повезло… Я пытался понять логику, но на данный момент она слишком сложна для меня… Может ли кто-нибудь мне помочь?

Share
  1. здесь: вам нужно создать мета-поле, поэтому сначала вы используете add_meta_box()

    // Hook into WordPress add_meta_boxes action
    add_action( 'add_meta_boxes', 'add_Businesses_custom_metabox' );
    
    /**
     * Add meta box function
     */
    function add_Businesses_custom_metabox() {
        add_meta_box( 'custom-metabox', __( 'Businesses' ), 'Businesses_custom_metabox', 'events', 'side', 'high' );
    }
    

    здесь вы можете видеть, что я использовал «события» в качестве типа сообщения, в котором я хочу зарегистрировать этот метабокс, и что моя функция обратного вызова: Businesses_custom_metabox() и это функция, которая фактически отображает метабокс, поэтому мы определяем ее следующим образом:

    /**
     * Display the metabox
     */
    function Businesses_custom_metabox($post) {
        global $post,$current_user;
        //remember the current $post object
        $real_post = $post;
        //get curent user info (we need the ID)
        get_currentuserinfo();
        //create nonce
        echo '<input type="hidden" name="Businesses_meta_box_nonce" value="', wp_create_nonce(basename(__FILE__)), '" />';
        //get saved meta
        $selected = get_post_meta( $post->ID, 'a_businesses', true );
        //create a query for all of the user businesses posts
        $Businesses_query = new WP_Query();
        $Businesses_query->query(array(
                                'post_type' => 'posts',
                                'posts_per_page' => -1,
                                'author' => $current_user->ID));
        if ($Businesses_query->have_posts()){
            echo '<select name="a_businesses" id="a_businesses">';
            //loop over all post and add them to the select dropdown
            while ($Businesses_query->have_posts()){
                $Businesses_query->the_post();
                echo '<option value="'.$post->ID.'" ';
                if ( $post->ID == $selected){
                    echo 'selected="selected"';
                }
                echo '>'.$post->post_title .'</option>';
            }
            echo '<select>';
        }
        //reset the query and the $post to its real value
        wp_reset_query();
        $post = $real_post;
    }
    

    Я попытался прокомментировать каждую часть этого, чтобы вы могли лучше понять. И последнее, что вам нужно сделать, это обработать метабокс при сохранении поста:

    //hook to save the post meta
    add_action( 'save_post', 'save_Businesses_custom_metabox' );
    /**
     * Process the custom metabox fields
     */
    function save_Businesses_custom_metabox( $post_id ) {
        global $post;
        // verify nonce
        if (!wp_verify_nonce($_POST['Businesses_meta_box_nonce'], basename(__FILE__))) {
            return $post_id;
        }
        // check autosave
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
            return $post_id;
        }
        // check permissions
        if ('events' == $_POST['post_type']) {
            if (!current_user_can('edit_page', $post_id)) {
                return $post_id;
            }
        } elseif (!current_user_can('edit_post', $post_id)) {
            return $post_id;
        }
    
        if( $_POST ) {
            $old = get_post_meta($post_id, 'a_businesses', true);
            $new = $_POST['a_businesses'];
            if ($new && $new != $old){
                update_post_meta($post_id, 'a_businesses', $new);
            }
        }
    }
    
    • 0
    • Знаете ли вы, что есть действие метабокса специально для регистрации метабоксов? (действие add_meta_boxes).. Кроме того, функции обратного вызова метабокса для сообщений получают $post объект в качестве первого параметра, например. function Businesses_custom_metabox( $post )

      • 0
    • WOW спасибо, что нашли время, чтобы помочь мне! Я добавил это в свой functions.php, и он отображает метабокс «Бизнес», но не раскрывает список сообщений. Было ли что-то, что я должен был отредактировать выше для моей ситуации?

      • 0
    • Кроме того, как я могу добавить это в свою форму внешнего интерфейса, чтобы пользователи могли отправлять события?

      • 0
    • @ t31os — как всегда спасибо за разъяснение, я обновил код, и я не знаю, почему я все время забываю о крючке «действие» add_meta_boxes.

      • 0
    • @Mike, у вас должны быть сообщения о компаниях, созданные тем же пользователем, с которым вы вошли в систему, чтобы увидеть какие-либо из них в раскрывающемся списке. а что касается отображения во внешнем интерфейсе, просто перепишите функцию Businesses_custom_metabox, чтобы она соответствовала потребностям внешнего интерфейса.

      • 0

Оставить ответ

You must login to add an answer.