WordPress 生成帖子的永久链接

Wordpress generating permalink of posts

我想知道 wordpress 如何在编写 post 时为 post 生成永久链接。


是否使用javascript?

它使用AJAX。 在您编写 post 时,JS 将标题发送到服务器,服务器将生成永久链接并将其发送回页面。

permalink 不是 "generated",要使用 permalink,请阅读 mod_rewrite。

link 看起来 "write-your-post-title-here" 是一个真实的文件,其实不是。

该页面可能会将您重定向到 "posts.php",那里正在分析附录,然后使用该选项启动数据库调用。

类似于

"SELECT * FROM posts WHERE title LIKE `write-your-post-title-here`"

没有 JS,没有 AJAX。

JS是用来"update"光学状态的link。因此,如果您单击编辑并更改 post 标题,JS 将动态更新您可以看到实际输入内容的文本。

嗨,你好吗是的,它是由 JS 完成的,ajax 一旦你写了标题,它就会发送带有 ajax 的标题并更改为永久链接并获得永久链接字段。我找到了源代码希望它能帮助你。

wp-admin/includes/post.php 第 1257 行

function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
    $post = get_post( $id );
    if ( ! $post )
        return '';

    list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);

    if ( current_user_can( 'read_post', $post->ID ) ) {
        $ptype = get_post_type_object( $post->post_type );
        $view_post = $ptype->labels->view_item;
    }

    if ( 'publish' == get_post_status( $post ) ) {
        $title = __('Click to edit this part of the permalink');
    } else {
        $title = __('Temporary permalink. Click to edit this part.');
    }

    if ( false === strpos( $permalink, '%postname%' ) && false === strpos( $permalink, '%pagename%' ) ) {
        $return = '<strong>' . __('Permalink:') . "</strong>\n" . '<span id="sample-permalink" tabindex="-1">' . $permalink . "</span>\n";
        if ( '' == get_option( 'permalink_structure' ) && current_user_can( 'manage_options' ) && !( 'page' == get_option('show_on_front') && $id == get_option('page_on_front') ) ) {
            $return .= '<span id="change-permalinks"><a href="options-permalink.php" class="button button-small" target="_blank">' . __('Change Permalinks') . "</a></span>\n";
        }
    } else {
        if ( function_exists( 'mb_strlen' ) ) {
            if ( mb_strlen( $post_name ) > 30 ) {
                $post_name_abridged = mb_substr( $post_name, 0, 14 ) . '&hellip;' . mb_substr( $post_name, -14 );
            } else {
                $post_name_abridged = $post_name;
            }
        } else {
            if ( strlen( $post_name ) > 30 ) {
                $post_name_abridged = substr( $post_name, 0, 14 ) . '&hellip;' . substr( $post_name, -14 );
            } else {
                $post_name_abridged = $post_name;
            }
        }

        $post_name_html = '<span id="editable-post-name" title="' . $title . '">' . $post_name_abridged . '</span>';
        $display_link = str_replace( array( '%pagename%', '%postname%' ), $post_name_html, urldecode( $permalink ) );
        $pretty_permalink = str_replace( array( '%pagename%', '%postname%' ), $post_name, urldecode( $permalink ) );

        $return =  '<strong>' . __( 'Permalink:' ) . "</strong>\n";
        $return .= '<span id="sample-permalink" tabindex="-1">' . $display_link . "</span>\n";
        $return .= '&lrm;'; // Fix bi-directional text display defect in RTL languages.
        $return .= '<span id="edit-slug-buttons"><a href="#post_name" class="edit-slug button button-small hide-if-no-js" onclick="editPermalink(' . $id . '); return false;">' . __( 'Edit' ) . "</a></span>\n";
        $return .= '<span id="editable-post-name-full">' . $post_name . "</span>\n";
    }

    if ( isset( $view_post ) ) {
        if( 'draft' == $post->post_status ) {
            $preview_link = set_url_scheme( get_permalink( $post->ID ) );
            /** This filter is documented in wp-admin/includes/meta-boxes.php */
            $preview_link = apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ), $post );
            $return .= "<span id='view-post-btn'><a href='" . esc_url( $preview_link ) . "' class='button button-small' target='wp-preview-{$post->ID}'>$view_post</a></span>\n";
        } else {
            if ( empty( $pretty_permalink ) ) {
                $pretty_permalink = $permalink;
            }

            $return .= "<span id='view-post-btn'><a href='" . $pretty_permalink . "' class='button button-small'>$view_post</a></span>\n";
        }
    }

    /**
     * Filter the sample permalink HTML markup.
     *
     * @since 2.9.0
     *
     * @param string      $return    Sample permalink HTML markup.
     * @param int|WP_Post $id        Post object or ID.
     * @param string      $new_title New sample permalink title.
     * @param string      $new_slug  New sample permalink slug.
     */
    $return = apply_filters( 'get_sample_permalink_html', $return, $id, $new_title, $new_slug );

    return $return;
}

这是使用的js

wp-admin/js/post.js 行 706

// permalink
function editPermalink() {
    var i, slug_value,
        c = 0,
        e = $('#editable-post-name'),
        revert_e = e.html(),
        real_slug = $('#post_name'),
        revert_slug = real_slug.val(),
        b = $('#edit-slug-buttons'),
        revert_b = b.html(),
        full = $('#editable-post-name-full');

    // Deal with Twemoji in the post-name
    full.find( 'img' ).replaceWith( function() { return this.alt; } );
    full = full.html();

    $('#view-post-btn').hide();
    b.html('<a href="#" class="save button button-small">'+postL10n.ok+'</a> <a class="cancel" href="#">'+postL10n.cancel+'</a>');
    b.children('.save').click(function() {
        var new_slug = e.children('input').val();
        if ( new_slug == $('#editable-post-name-full').text() ) {
            b.children('.cancel').click();
            return false;
        }
        $.post(ajaxurl, {
            action: 'sample-permalink',
            post_id: postId,
            new_slug: new_slug,
            new_title: $('#title').val(),
            samplepermalinknonce: $('#samplepermalinknonce').val()
        }, function(data) {
            var box = $('#edit-slug-box');
            box.html(data);
            if (box.hasClass('hidden')) {
                box.fadeIn('fast', function () {
                    box.removeClass('hidden');
                });
            }

            b.html(revert_b);
            real_slug.val(new_slug);
            $('#view-post-btn').show();
        });
        return false;
    });