Есть ли способ создать собственный URL-адрес продукта на основе атрибутов продукта, у меня есть солнцезащитные очки продукта, к которым привязаны несколько атрибутов: металлический, синий и круглый, поэтому текущий URL-адрес:
website.com/glasses/sunglasses/abram-widana-629/
Я пытаюсь получить URL-адрес, в который включены эти атрибуты:
website.com/glasses/sunglasses/abram-widana-meta-blue-round-629/
Я был бы очень признателен, если бы кто-нибудь просто указал мне правильное направление, как решить эту проблему.
База атрибутов продукта, похоже, работает как категория, она показывает все продукты, содержащие выбранный атрибут, но когда вы нажимаете на фактический продукт, атрибуты не остаются в фактическом URL-адресе самого продукта :(
Есть два способа сделать это: вручную или программно.
В вашем примере вы просто настраиваете URL-адрес продукта, чтобы включить атрибуты. Этого можно добиться вручную, отредактировав постоянную ссылку на самом продукте.
После того, как продукт был добавлен/сохранен, вы увидите постоянную ссылку, отображаемую непосредственно под полем заголовка, например:
Просто нажмите кнопку Редактировать рядом с ним и измените его с abram-widana-629
на abram-widana-meta-blue-round-629
.
Если вы хотите добиться этого на постоянной основе для всех продуктов, вам придется работать с фильтром/хуком «save_post», чтобы добавить все атрибуты в постоянную ссылку. Единственным недостатком этого является то, что вы больше не сможете настраивать свои индивидуальные постоянные ссылки для своих продуктов, поскольку они просто вернутся обратно, как только вы нажмете «Сохранить».
Ниже приведен пример кода, как этого добиться:
add_action( 'save_post', 'add_custom_attributes_to_permalink', 10, 3 );
function add_custom_attributes_to_permalink( $post_id, $post, $update ) {
//make sure we are only working with Products
if ($post->post_type != 'product' || $post->post_status == 'auto-draft') {
return;
}
//get the product
$_product = wc_get_product($post_id);
//get the "clean" permalink based on the post title
$clean_permalink = sanitize_title( $post->post_title, $post_id );
//next we get all of the attribute slugs, and separate them with a "-"
$attribute_slugs = array(); //we will be added all the attribute slugs to this array
foreach ($_product->get_attributes(); as $attribute_slug => $attribute_value) {
$attribute_slugs[] = $attribute_value;
}
$attribute_suffix = implode('-', $attribute_slugs);
//then add the attributes to the clean permalink
$full_permalink = $clean_permalink.$attribute_suffix;
// unhook the save post action to avoid a broken loop
remove_action( 'save_post', 'add_custom_attributes_to_permalink', 10, 3 );
// update the post_name (which becomes the permalink)
wp_update_post( array(
'ID' => $post_id,
'post_name' => $full_permalink
));
// re-hook the save_post action
add_action( 'save_post', 'add_custom_attributes_to_permalink', 10, 3 );
}
Большое спасибо, сэр, именно то направление, которое я искал :)
Я попытался скопировать и вставить ваш код на свой сайт. Но пишет Ошибка Parsar
@Jornes, это странно, вы вообще не должны получать ошибку парсера с этим кодом? И код определенно работает. Я бы предложил открыть новый вопрос, включая код, который вы используете (этот код выше), куда он был вставлен, и точную ошибку. Не стесняйтесь добавлять ссылку на свой новый вопрос в комментариях здесь, и я пойду посмотрю для вас :)
Но это просто показывает. Не уверен, почему!
Это может быть полезно: docs.woocommerce.com/document/постоянные ссылки . (сам не пробовал). Возможно, вы могли бы использовать раздел «Постоянные ссылки таксономии» с «База атрибутов продукта».