我想知道wordpress在撰写帖子时如何为帖子创建永久链接。
是否使用javascript?
答案 0 :(得分:2)
你好,你是如何完成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 ) . '…' . 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 ) . '…' . 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 .= '‎'; // 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;
});
答案 1 :(得分:1)
它使用AJAX。 在您撰写帖子时,JS会将标题发送到服务器,生成永久链接并将其发送回页面。
答案 2 :(得分:1)
永久链接不是“生成”,因为使用固定链接,请阅读mod_rewrite。
链接看起来像“写你的帖子 - 标题 - 这里”是一个实际的文件,但不是。
该页面会将您重定向到“posts.php”,在那里正在分析appendex,然后启动db调用,确切地说就是这些选项。
类似
"SELECT * FROM posts WHERE title LIKE `write-your-post-title-here`"
没有JS,没有AJAX。
JS用于“更新”链接的光学状态。因此,如果您单击编辑并更改帖子标题,JS将动态更新您可以看到实际输入内容的文本。