yoast.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /* global vc, YoastSEO, _, jQuery */
  2. (function ( $ ) {
  3. 'use strict';
  4. $( window ).on( 'YoastSEO:ready', function () {
  5. var imageEventString, vcYoast, relevantData, pluginName, eventsList;
  6. relevantData = {};
  7. pluginName = 'vcVendorYoast';
  8. eventsList = [
  9. 'sync',
  10. 'add',
  11. 'update'
  12. ];
  13. var contentModification = function ( data ) {
  14. data = _.reduce( relevantData, function ( memo, value, key ) {
  15. if ( value.html ) {
  16. memo = memo.replace( '"' + value.text + '"', value.html );
  17. }
  18. if ( value.image && value.param ) {
  19. var i, imagesString = '', attachment;
  20. for ( i = 0; value.image.length > i; i ++ ) {
  21. attachment = window.wp.media.model.Attachment.get( value.image[ i ] );
  22. if ( attachment.get( 'url' ) ) {
  23. imagesString += '<img src=\'' + attachment.get( 'url' ) + '\' alt=\'' + (attachment.get( 'alt' ) || attachment.get( 'caption' ) || attachment.get( 'title' )) + '\'>';
  24. }
  25. }
  26. memo += imagesString;
  27. }
  28. return memo;
  29. }, data );
  30. return data;
  31. };
  32. function getImageEventString( e ) {
  33. return ' shortcodes:' + e + ':param:type:attach_image' + ' shortcodes:' + e + ':param:type:attach_images';
  34. }
  35. // add relevant data for images
  36. imageEventString = _.reduce( eventsList, function ( memo, e ) {
  37. return memo + getImageEventString( e );
  38. }, '' );
  39. vc.events.on( imageEventString, function ( model, param, settings ) {
  40. if ( param && param.length > 0 ) {
  41. var ids = param.split( /\s*,\s*/ );
  42. _.each( ids, function ( id ) {
  43. var attachment = window.wp.media.model.Attachment.get( id );
  44. if ( !attachment.get( 'url' ) ) {
  45. attachment.once( 'sync', function () {
  46. YoastSEO.app.pluginReloaded( pluginName );
  47. } );
  48. attachment.fetch();
  49. }
  50. } );
  51. relevantData[ model.get( 'id' ) + settings.param_name ] = {
  52. image: ids,
  53. paramName: settings.param_name,
  54. param: param
  55. };
  56. }
  57. } );
  58. vc.events.on( getImageEventString( 'destroy' ), function ( model, param, settings ) {
  59. delete relevantData[ model.get( 'id' ) + settings.param_name ];
  60. } );
  61. // Add relevant data to headings
  62. vc.events.on( 'shortcodes:vc_custom_heading', function ( model, event ) {
  63. var params, tagSearch;
  64. params = model.get( 'params' );
  65. params = _.extend( {}, vc.getDefaults( model.get( 'shortcode' ) ), params );
  66. if ( 'destroy' === event ) {
  67. delete relevantData[ model.get( 'id' ) ];
  68. } else if ( params.text && params.font_container ) {
  69. tagSearch = params.font_container.match( /tag:([^\|]+)/ );
  70. if ( tagSearch[ 1 ] ) {
  71. relevantData[ model.get( 'id' ) ] = {
  72. html: '<' + tagSearch[ 1 ] + '>' + params.text + '</' + tagSearch[ 1 ] + '>',
  73. text: params.text
  74. };
  75. }
  76. }
  77. } );
  78. var VcVendorYoast = function () {
  79. // init
  80. YoastSEO.app.registerPlugin( pluginName, { status: 'ready' } );
  81. YoastSEO.app.pluginReady( pluginName );
  82. YoastSEO.app.registerModification( 'content', contentModification, pluginName, 5 );
  83. };
  84. vcYoast = new VcVendorYoast();
  85. } );
  86. })( window.jQuery );