How to tag the main tag? [closed]

You can’t make a main tag per post. Tags are a not hyerarchycal taxonomy, and by definition, not hyerarchycal taxonomies have no hyerarchy, none of the terms can be more important than each other.

In order to accomplish your task, most WP developers would suggest yo to make some custom field to store your “main tag”, and then use it to retrieve your related posts. Something like this in your functions.php would construct your custom field metabox:

/**
 * Generated by the WordPress Meta Box Generator at http://goo.gl/8nwllb

 */
class Custom_Meta_Box {
private $screens = array(
    'post',
);
private $fields = array(
    array(
        'id' => 'main-tag',
        'label' => 'Main tag',
        'type' => 'text',
    ),
);

/**
 * Class construct method. Adds actions to their respective WordPress hooks.
 */
public function __construct() {
    add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
    add_action( 'save_post', array( $this, 'save_post' ) );
}

/**
 * Hooks into WordPress' add_meta_boxes function.
 * Goes through screens (post types) and adds the meta box.
 */
public function add_meta_boxes() {
    foreach ( $this->screens as $screen ) {
        add_meta_box(
            'main-tag',
            __( 'Main Tag', 'your-textdomain' ),
            array( $this, 'add_meta_box_callback' ),
            $screen,
            'side',
            'default'
        );
    }
}

/**
 * Generates the HTML for the meta box
 * 
 * @param object $post WordPress post object
 */
public function add_meta_box_callback( $post ) {
    wp_nonce_field( 'main_tag_data', 'main_tag_nonce' );
    echo 'Use this field to set the main tag:';
    $this->generate_fields( $post );
}

/**
 * Generates the field's HTML for the meta box.
 */
public function generate_fields( $post ) {
    $output="";
    foreach ( $this->fields as $field ) {
        $label="<label for="" . $field['id'] . '">' . $field['label'] . '</label>';
        $db_value = get_post_meta( $post->ID, 'main_tag', true );
        switch ( $field['type'] ) {
            default:
                $input = sprintf(
                    '<input id="%s" name="%s" type="%s" value="%s">',
                    $field['id'],
                    $field['id'],
                    $field['type'],
                    $db_value
                );
        }
        $output .= '<p>' . $label . '<br>' . $input . '</p>';
    }
    echo $output;
}

/**
 * Hooks into WordPress' save_post function
 */
public function save_post( $post_id ) {
    if ( ! isset( $_POST['main_tag_nonce'] ) )
        return $post_id;

    $nonce = $_POST['main_tag_nonce'];
    if ( !wp_verify_nonce( $nonce, 'main_tag_data' ) )
        return $post_id;

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
        return $post_id;

    foreach ( $this->fields as $field ) {
        if ( isset( $_POST[ $field['id'] ] ) ) {
            switch ( $field['type'] ) {
                case 'email':
                    $_POST[ $field['id'] ] = sanitize_email( $_POST[ $field['id'] ] );
                    break;
                case 'text':
                    $_POST[ $field['id'] ] = sanitize_text_field( $_POST[ $field['id'] ] );
                    break;
            }
            update_post_meta( $post_id, 'main_tag', $_POST[ $field['id'] ] );
        } else if ( $field['type'] === 'checkbox' ) {
            update_post_meta( $post_id, 'main_tag', '0' );
        }
    }
}
}
new Custom_Meta_Box;

Once you have your custom field metabox, you should fill it with a valid tag slug (I suggest slug better than a name or term ID) and use it to retrieve your related posts by making this kind of query inside single.php:

$args = array(
    'meta_key'   => 'main_tag',
    'meta_value' => get_post_meta($post->ID, 'main_tag', true);
);
$query = new WP_Query( $args );